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

新手上路,请多包涵

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

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

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

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

原文由 Jose L Martinez-Avial 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 488
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;
 }


如果您需要/想要 一个 Set 并提供 getIndex() 方法的类,我强烈建议实现一个新的 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;
   }
 }

原文由 Andreas Dolk 发布,翻译遵循 CC BY-SA 4.0 许可协议

创建 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";

原文由 Kiryl Ivanou 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题