我有一个数组,比如说
List<Integer>
,内容如下:139, 127, 127, 139, 130
如何去重并保持其原始顺序?即得到:139, 127, 130
List<Integer>
,内容如下:139, 127, 127, 139, 130
如何去重并保持其原始顺序?即得到:139, 127, 130
使用 java.util.LinkedHashSet
的一个实例。
Set<Integer> set = new LinkedHashSet<>(list);
去掉 LinkedHashSet
开销 (使用仅稍微更快的 HashSet
来表示已经查找过的元素):
List<Integer> noDuplicates = list
.stream()
.distinct()
.collect(Collectors.toList());
使用这个一行代码:
yourList = new ArrayList<Integer>(new LinkedHashSet<Integer>(yourList))
从您的列表中构建一个Set
- "一个不包含重复元素的集合":
Set<Integer> yourSet = new HashSet<Integer>(yourList);
并将其转换回您想要的任何格式。
注意:如果您想保留顺序,请使用LinkedHashSet
。
LinkedHashSet
来保留插入顺序。 - Axel方法一:在Python中 => 使用集合和列表推导式
a= [139, 127, 127, 139, 130]
print(a)
seen =set()
aa = [ch for ch in a if ch not in seen and not seen.add(ch)]
print(aa)
方法二:
aa = list(set(a))
print(aa)
class t1 {
public static void main(String[] args) {
int[] a = {139, 127, 127, 139, 130};
List<Integer> list1 = new ArrayList<>();
Set<Integer> set = new LinkedHashSet<Integer>();
for( int ch : a) {
if(!set.contains(ch)) {
set.add(ch);
}
}//for
set.forEach( (k) -> list1.add(k));
System.out.println(list1);
}
}
Bro this is you answer but this have 0(n2) T.C remember.
vector<int> sol(int arr[],int n){
vector<int> dummy;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(arr[i]==arr[j]){
dummy.push_back(j);
}
}
}
vector<int> ans;
for(int i=0;i<n;i++){
bool check=true;
for(int j=0;j<dummy.size();j++){
if(dummy[j]==i){
check=false;
}
}
if(check==false)
continue;
ans.push_back(arr[i]);
}
return ans;
}
尽管将ArrayList转换为HashSet可以有效地去除重复项,但如果您需要保留插入顺序,我建议您使用这个变体
// list是一些字符串列表
Set<String> s = new LinkedHashSet<String>(list);
有两种方法:
创建只包含唯一整数的新列表
您可以使用2个嵌套的for循环来执行此操作,如下所示O(n.n/2):
List<int> src,dst;
// src是输入列表
// dst是输出列表
dst.allocate(src.num); // 准备大小以避免通过重新分配减速
dst.num=0; // 从空列表开始
for (int i=0;i<src.num;i++)
{
int e=1;
for (int j=0;i<dst.num;i++)
if (src[i]==dst[j]) { e=0; break; }
if (e) dst.add(src[i]);
}
您可以选择重复项并将其删除... O(2.n)使用标记删除
好的,现在如何检查重复性...
List<WORD> src; // src是输入列表
BYTE cnt[65536]; // 计算所有使用数字的使用情况
int i;
for (i=0;i<65536;i++) cnt[i]=0; // 清除所有数字的计数
for (i=0;i<src.num;i++) // 计算列表中使用数字的计数
if (cnt[src[i]]!=255)
cnt[src[i]]++;
为此,请将cnt[]更改如下
for (i=0;i<65536;i++) if (cnt[i]>1) cnt[i]=1; else cnt[i]=0;
好的,现在来到删除部分:
for (i=0;i<src.num;i++)
if (cnt[src[i]]==1) cnt[src[i]]=2; // 第一次不要删除
else if (cnt[src[i]]==2) // 但所有其他人都是
{
src.del(i);
i--; // 删除后,src中的索引已更改,因此请重新检查相同的索引
}
您可以将两种方法结合在一起
PS. 抱歉使用了非标准的列表,但我认为代码足够易懂,如果不是,请评论我并回复。
PPS. 对于带符号值的使用,请不要忘记将地址向半范围移动!!!
LinkedHashSet
来去除重复项并保持顺序。我理解你需要保留插入顺序,除了使用 @Maroun Maroun 提到的 set 外,你可以使用特殊实现,例如 LinkedHashSet<E>
,它恰好可以满足你的需求。