我知道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,并获取该集合中字符串的索引。有没有这样的,或者我需要自己实现它?
答案 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
这是一个没有重复的列表