我希望您能夠提出一種方法,在該方法中,我想對一組整數值進行排序,但保留其索引記憶。對整數進行排序,但保留索引以恢復其順序
這就是我想對整數進行排序,對它們執行一些操作,然後在排序之前將它們恢復到相同順序。
對數據結構或算法有何建議?
我希望您能夠提出一種方法,在該方法中,我想對一組整數值進行排序,但保留其索引記憶。對整數進行排序,但保留索引以恢復其順序
這就是我想對整數進行排序,對它們執行一些操作,然後在排序之前將它們恢復到相同順序。
對數據結構或算法有何建議?
您需要將數據及其原始索引放入一個類中,並以僅比較數據的方式定義比較。
public class SortItemHelper implements Comparable<SortItemHelper>
{
Data data;
int originalIndex;
public int compareTo(SortItemHelper other)
{
if (other == null)
return 1;
return data.compareTo(other.data);
}
...
}
(你想使這個在Data
通用。)
使它所以要排序的對象數組(可能是包裝類自己設計),它知道它自己的位置)。
如果有人正在尋找一個通用的實現,我已經做了一個。
基本抽象類:
public abstract class AbstractSortHelper<T> implements Comparable<AbstractSortHelper<T>> {
protected final int index;
protected final T data;
public AbstractSortHelper(int index, T data) {
this.index = index;
this.data = data;
}
public int getIndex() {
return index;
}
public T getData() {
return data;
}
}
第一延伸類可用於實現比較的對象:
public class ComparableSortHelper<T extends Comparable> extends AbstractSortHelper<T> {
public ComparableSortHelper(int index, T data) {
super(index, data);
}
@Override
public int compareTo(AbstractSortHelper<T> o) {
return this.data.compareTo(o.data);
}
}
第二伸出類可用於不執行比較的對象。當使用您必須實現一個比較:
public abstract class ComparatorSortHelper<T> extends AbstractSortHelper<T> implements Comparator<T> {
public ComparatorSortHelper(int index, T data) {
super(index, data);
}
@Override
public int compareTo(AbstractSortHelper<T> {
return compare(this.data, o.data);
}
}
擴展ComparatorSortHelper看起來是這樣的:
class DataSortHelper extends ComparatorSortHelper<Object[]> {
public DataSortHelper(int index, Object[] data) {
super(index, data);
}
@Override
public int compare(Object[] o1, Object[] o2) {
return Integer.compare((Integer) o1[0], (Integer) o2[0]);
}
}
使用此之後,排序很簡單:
List<DataSortHelper> list = new ArrayList<>();
// ...
Collections.sort(list);
希望它可以幫助別人。 :)
簡單的方法:排序集的*副本*,離開原來的單獨。 –
請輸入一個例子,爲什麼你想這樣做? – jakx
取而代之的是對它們進行分類,更改和不分類,爲什麼不改變它們在哪裏,因爲它們就是它們的起點和最終結果? –