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

时间:2010-12-09 07:27:03

标签: java 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");

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

5 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:12)

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

 public static int getIndex(Set<? extends Object> 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<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;
   }
 }

答案 2 :(得分:3)

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

答案 3 :(得分:0)

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

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

  int indexOfThirdString = itemIndex.get("Third String");

答案 4 :(得分:0)

一种解决方案(虽然不是很漂亮)是使用Apache常见的List / Set变异

abcde
fghi
jklmnop

这是一个没有重复的列表

https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.2/index.html?org/apache/commons/collections/list/SetUniqueList.html