2011-11-28 70 views
1

我希望您能夠提出一種方法,在該方法中,我想對一組整數值進行排序,但保留其索引記憶。對整數進行排序,但保留索引以恢復其順序

這就是我想對整數進行排序,對它們執行一些操作,然後在排序之前將它們恢復到相同順序。

對數據結構或算法有何建議?

+7

簡單的方法:排序集的*副本*,離開原來的單獨。 –

+0

請輸入一個例子,爲什麼你想這樣做? – jakx

+0

取而代之的是對它們進行分類,更改和不分類,爲什麼不改變它們在哪裏,因爲它們就是它們的起點和最終結果? –

回答

3

您需要將數據及其原始索引放入一個類中,並以僅比較數據的方式定義比較。

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通用。)

1

使它所以要排序的對象數組(可能是包裝類自己設計),它知道它自己的位置)。

1

如果有人正在尋找一個通用的實現,我已經做了一個。

基本抽象類:

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); 

希望它可以幫助別人。 :)

相關問題