如何在 java.util.Set 中获取项目的索引

2022-09-01 00:36:20

我知道集合和列表之间的区别(唯一与允许重复,而不是有序/有序等)。我正在寻找的是一个保持元素有序的集合(这很容易),但我还需要能够恢复插入元素的索引。因此,如果我插入四个元素,那么我希望能够知道其中一个元素的插入顺序。

MySet<String> set = MySet<String>();
set.add("one");
set.add("two");
set.add("three");
set.add("four");

int index = set.getIndex("two");

因此,在任何给定的时刻,我都可以检查是否已添加字符串,并获取集合中字符串的索引。有没有类似的东西,或者我需要自己实现它?


答案 1

创建Set后,只需将其转换为List并从List中获取索引:

Set<String> stringsSet = new HashSet<>();
stringsSet.add("string1");
stringsSet.add("string2");

List<String> stringsList = new ArrayList<>(stringsSet);
stringsList.get(0); // "string1";
stringsList.get(1); // "string2";

答案 2

类中的小型静态自定义方法会有所帮助:Util

 public static <T> int getIndex(Set<T> set, T value) {
   int result = 0;
   for (T entry:set) {
     if (entry.equals(value)) return result;
     result++;
   }
   return -1;
 }
  

如果你需要/想要一个类,它是一个并提供一种方法,我强烈建议实现一个新的并使用装饰器模式:SetgetIndex()Set

 public class IndexAwareSet<T> implements Set {
   private Set<T> set;
   public IndexAwareSet(Set<T> set) {
     this.set = set;
   }

   // ... implement all methods from Set and delegate to the internal Set

   public int getIndex(T entry) {
     int result = 0;
     for (T entry:set) {
       if (entry.equals(value)) return result;
       result++;
     }
     return -1;
   }
 }

推荐