⑴ Linux下C++读取文件去重的问题
#include<fstream>
#include<vector>
#include<string>
#include<algorithm>
#include<iostream>
#include<sstream>
classdata_t{
public:
data_t():val(5){}
std::string&operator[](intconsti){
returnval[i];
}
std::stringconst&operator[](intconsti)const{
returnval[i];
}
private:
std::vector<std::string>val;
};
template<inti>
structcmp1{//用于sort函数
booloperator()(data_tconst&a,data_tconst&b)const{
returna[i]<b[i];
}
};
template<inti>
structcmp2{//用于unique函数
booloperator()(data_tconst&a,data_tconst&b)const{
returna[i]==b[i];
}
};
intmain(){
std::ifstreamistr("input.txt");
if(!istr){
std::cerr<<"文件打开失败 ";
return__LINE__;
}
typedefstd::vector<data_t>vector_t;
vector_tdata;
//读取文件
std::stringline;
intline_num=0;
while(getline(istr,line)){
++line_num;
data_ttmp_data;
std::istringstreamtmp_str(line);
inti=0;
for(;i!=5;++i){
if(!getline(tmp_str,tmp_data[i],' ')){
std::cerr<<"在第"<<line_num<<"行发生错误 ";
}
}
if(i==5){//该行读取成功
data.push_back(tmp_data);
}
}
//按关键字1去重
std::sort(data.begin(),data.end(),cmp1<0>());
vector_t::iteratorlast=std::unique(data.begin(),data.end(),cmp2<0>());
//按关键字2去重
std::sort(data.begin(),last,cmp1<1>());
last=std::unique(data.begin(),last,cmp2<1>());
data.erase(last,data.end());
//输出到另一个文件
std::ofstreamostr("output.txt");
if(!ostr){
std::cerr<<"文件打开失败 ";
return__LINE__;
}
for(inti=0;i!=data.size();++i){
for(intj=0;j!=5;++j){
ostr<<data[i][j]<<" ";
}
ostr<<" ";
}
return0;
}
输入文件为input.txt,样例:
111222333444555
111222333444555
1111222333444555
1111222333444555
11111222333444555
11111222333444555
输出到output.txt,样例:
111222333444555
⑵ 一个arraylist,往里面add值的时候,遇到重复就不要添加,怎么做
可以使用set做媒介,先将需要加入的数据存入set后再从set存入list。
如图所示
Set和List的区别
1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变<实现类有HashSet,TreeSet>。
3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变<实现类有ArrayList,LinkedList,Vector>。
⑶ list和set的区别
在Java编程中,List和Set是两种常见的集合类型,它们各有特色。首先,List是可重复的,允许存储元素出现多次,例如ArrayList、Vector和LinkedList都实现了List接口,它们的特点是元素有序,适合存储单列数据,允许数据重复。相反,Set是不可重复的集合,主要由HashSet和TreeSet实现,这意味着其中的元素是唯一的,这使得Set在查找和去重操作上更为高效。
其次,List和Set在数据结构上有所区别。List更像是有序的数据序列,元素的插入和删除会影响其顺序,而Set则更像是键值对的存储,以键(key)为唯一标识,值(value)可以有重复,但键是不允许重复的。因此,如果你需要保持元素的唯一性和顺序,可以选择List;如果关注的是去重和快速查找,Set则更为合适。