gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:19:45 28 4
gpt4 key购买 nike

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

indices = new int[depth.size()];
ArrayList<Float> fStore = new ArrayList(depth);
Collections.sort(depth);
for (int n=0; n<depth.size(); n++){
indices[n] = fStore.indexOf(depth.get(n));
}

最佳答案

indexOf() 的问题是它返回列表中元素第一次出现的索引,或 -1如果不存在。如果您的列表有重复项,那么对于这些​​重复项,您将获得它们在列表中第一次出现的索引。

有很多方法可以实现您想要的目标。一种是使用 SortedSet和一个 helper 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 的列表进行排序:

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

关于java - 如何获取已排序的 Java ArrayList 的唯一索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31390018/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com