如何解决根据另一个列表中的重复索引从列表中删除重复项
我有2个列表:Names
和IDs
。
在某些情况下,同一名称会多次出现。例如:
Names = {'ben','david','jerry','tom','ben'}
IDs = {'123','23456','34567','123','123'}
我知道我可以使用
Set<String> set = new LinkedHashSet<>( Names );
Names .clear();
Names .addAll( set );
但是,要删除重复项,这不是我想要的。
我想做的是检查Names
的重复值(在这种情况下将是最后一个值),然后从IDs
中删除该位置的值,以便最终结果是:
Names = {'ben','tom'}
IDs = {'123','123'}
如何获取重复值的索引以将其从第二个列表中删除?还是有一些简单快捷的方法?
我确定可以使用循环来解决它,但我会尽量避免使用它。
解决方案:
我更改了使用的代码:
Map<String,String> map = new HashMap<>();
使用时:
map.put(name,id);
它可能不起作用,因为在某些情况下,相同的名称具有不同的名称,并且不允许名称重复,因此只需将其更改为map.put(id,name)
即可。
谢谢
解决方法
您可以将两个输入数组/列表中的数据收集到一组对中,然后将这些对重新收集回到两个新列表中(或清除并重用现有的names
/ IDs
列表):
List<String> names = Arrays.asList("ben","david","jerry","tom","ben");
List<String> IDs = Arrays.asList("123","23456","34567","123","123");
// assuming that both lists have the same size
// using list to store a pair
Set<List<String>> deduped = IntStream.range(0,names.size())
.mapToObj(i -> Arrays.asList(names.get(i),IDs.get(i)))
.collect(Collectors.toCollection(LinkedHashSet::new));
System.out.println(deduped);
System.out.println("-------");
List<String> dedupedNames = new ArrayList<>();
List<String> dedupedIDs = new ArrayList<>();
deduped.forEach(pair -> {dedupedNames.add(pair.get(0)); dedupedIDs.add(pair.get(1)); });
System.out.println(dedupedNames);
System.out.println(dedupedIDs);
输出:
[[ben,123],[david,23456],[jerry,34567],[tom,123]]
-------
[ben,david,jerry,tom]
[123,23456,34567,123]
,
您可以使用Collectors.toMap
作为地图进行收集,然后从地图中获取名称和ID列表的keySet和值。
List<String> names = Arrays.asList("ben","ben");
List<String> ids = Arrays.asList("123","123");
Map<String,String> map =
IntStream.range(0,ids.size())
.boxed()
.collect(Collectors.toMap(i -> names.get(i),i -> ids.get(i),(a,b) -> a,LinkedHashMap::new));
List<String> newNames = new ArrayList<>(map.keySet());
List<String> newIds = new ArrayList<>(map.values());
您还可以使用循环来制作地图创建部分
Map<String,String> map = new LinkedHashMap<>();
for (int i = 0; i < names.size(); i++) {
if(!map.containsKey(names.get(i))) {
map.put(names.get(i),ids.get(i));
}
}
,
只要Set.add
返回true,就可以将名称逐个添加到集合中;如果返回false,则将该元素的索引存储在列表中(要删除的索引)。然后以相反的顺序对索引列表进行排序,并在名称列表和ID列表上同时使用List.remove(int n)
:
List<String> names = ...
List<String> ids = ...
Set<String> set = new HashSet<>();
List<Integer> toRemove = new ArrayList<>();
for(int i = 0; i< names.size(); i ++){
if(!set.add(names.get(i))){
toRemove.add(i);
}
}
Collections.sort(toRemove,Collections.reverseOrder());
for (int i : toRemove){
names.remove(i);
ids.remove(i);
}
System.out.println(toRemove);
System.out.println(names);
System.out.println(ids);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。