在 LinkedHashSet 中找到唯一值的索引

find the index of unique values in LinkedHashSet

我正在使用 LinkedHashSet 从 ArrayList 中获取所有唯一值。

我的代码如下所示:

Set<String> set = new LinkedHashSet<>( filteredTitles );
filteredTitles.clear();
filteredTitles.addAll( set );

例如,如果 filteredTitles 等于 ["a","b","c","a"] 它会 return 我 ["a","b","c"]

如何获取唯一值的索引?例如这里 [1,2,3] 因为 4 已经不是唯一的了。

谢谢

您可以为每个唯一元素检索它在第一个列表中的第一个索引。索引也从 0

开始
List<String> titles = Arrays.asList("a", "b", "c", "a", "e");
List<String> uniqueTitles = new ArrayList<>(new LinkedHashSet<>(titles));

List<Integer> indices = uniqueTitles.stream().map(titles::indexOf).collect(Collectors.toList());

System.out.println(uniqueTitles); // [a, b, c, e]
System.out.println(indices);      // [0, 1, 2, 4]

与其简单地将列表复制到 LinkedHashSet,不如将其与索引列表一起构建:

Set<String> set = new LinkedHashSet<>();
List<Integer> firstOccurrences = new ArrayList<>();

for (int i = 0; i < filteredTitles.size(); ++i) {
  if (set.add(filteredTitles.get(i))) {
    firstOccurrences.add(i);
  }
}

How can I get the index of the unique values?

这是使用地图的一种方法。

  • 地图维护对象作为键和索引作为值。
  • 集合会保留之前添加的对象的记录,以确保只添加唯一的对象。
List<String> list = List.of("a","b","e","c","a","d","f","e","f","e","g");

 
Set<String> seen = new HashSet<>();
Map<String,Integer> uniquePair = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
    String str = list.get(i);
    if (seen.add(str)) { // if not seen already, add to map
       uniquePair.put(str, i);
       continue;
    }
    uniquePair.remove(str); // oops, not unique, remove from map.
}
  
uniquePair.entrySet().forEach(System.out::println);

打印

b=1
c=3
d=5
g=10