如何获取已排序的Java ArrayList的唯一索引?

时间:2015-07-13 17:45:11

标签: java arraylist

我有一个需要排序的ArrayList,但我也需要获取已排序项的索引。 ArrayList在更新时经常有许多重复值,并且我得到的indexex是重复的。我需要独特的索引。有没有办法获得这些索引?

maven-cucumber-reporting

1 个答案:

答案 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列表将包含元素以及原始索引。