我有一个需要排序的ArrayList,但我也需要获取已排序项的索引。 ArrayList在更新时经常有许多重复值,并且我得到的indexex是重复的。我需要独特的索引。有没有办法获得这些索引?
maven-cucumber-reporting
答案 0 :(得分:1)
indexOf()
的问题在于它返回列表中元素的第一次出现的索引,如果不存在则返回-1
。如果您的列表有重复项,那么,对于这些重复项,您将获得列表中第一次出现的索引。
有很多方法可以达到你想要的效果。一种是使用SortedSet
和帮助IndexedEntry
类:
public class IndexedEntry<T extends Comparable<T>>
implements Comparable<IndexedEntry<T>> {
private final Integer index;
private final T entry;
public IndexedEntry(Integer index, T entry) {
this.index = index;
this.entry = entry;
}
public Integer getIndex() {
return this.index;
}
public T getEntry() {
return this.entry;
}
@Override
public int compareTo(IndexedEntry<T> other) {
int byEntry = this.getEntry().compareTo(other.getEntry());
if (byEntry == 0) {
return this.getIndex().compareTo(other.getIndex());
}
return byEntry;
}
@Override
public String toString() {
return "(" + this.entry + ", " + this.index + ")";
}
}
IndexedEntry
类只包含Comparable
值及其索引,并通过首先比较值来实现Comparable
,如果值相等,则比较索引。这意味着IndexedEntry
的有序列表将按(value, index)
排序其元素。
要使用IndexedEntry
类,只需遍历集合,通过包装元素及其索引为每个元素创建IndexedEntry
,然后对IndexedEntry
的列表进行排序:< / p>
List<Float> unordered = new ArrayList<>(Arrays.asList(3.2f, 1.0f, 7.5f, 3.2f, 0.8f));
System.out.println(unordered); // [3.2, 1.0, 7.5, 3.2, 0.8]
List<IndexedEntry<Float>> ordered = new ArrayList<>();
for (int i = 0; i < unordered.size(); i++) {
IndexedEntry<Float> entry = new IndexedEntry<>(i, unordered.get(i));
ordered.add(entry);
}
Collections.sort(ordered);
System.out.println(ordered); // [(0.8, 4), (1.0, 1), (3.2, 0), (3.2, 3), (7.5, 2)]
排序后,ordered
列表将包含元素以及原始索引。