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

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

MySet set = MySet(); set.add("one"); set.add("two"); set.add("three"); set.add("four"); int index = set.getIndex("two"); 

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

Util类中的一个小的静态自定义方法有助于:

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

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

  public class IndexAwareSet implements Set { private Set set; public IndexAwareSet(Set 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; } } 

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

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

你可以扩展LinkedHashSet添加你想要的getIndex()方法。 实施和测试它需要15分钟。 只需使用迭代器和计数器遍历集合,检查对象是否相等。 如果找到,请退回柜台。

如何将字符串添加到值为索引的哈希表中:

  Hashtable itemIndex = new Hashtable<>(); itemIndex.put("First String",1); itemIndex.put("Second String",2); itemIndex.put("Third String",3); int indexOfThirdString = itemIndex.get("Third String");