如何对数组进行排序并在java中跟踪索引

时间:2014-05-10 23:15:45

标签: java arrays sorting

我正在尝试排序(减少)整数数组,但要跟踪原始索引。

我的意思是,例如,如果我有这个数组:

b[] = { 4, 5, 3, 5, 2 }   

使用Arrays.sort(b,Collections.reverseOrder())后,它变成了 (我使用的是Arrays.sort,因为在这个例子中b只有长度为5,但在我的问题中,b的长度可以是1< b.length< 70

b[] = { 5, 5, 4, 3, 2 }

但我想以某种方式拥有原始索引,我的意思是知道

bOrignalIndex[] = { 1, 3, 0, 2, 4 }

我不知道我的问题是否清楚,请问我一切。 我在C ++中使用这段代码可能会有所帮助,因为它可以实现我想要的功能

n=4
m=5
tord[] =  
[0] 0   
[1] 1   
[2] 2   
[3] 3   
ts[] =      
[0] 4   
[1] 5   
[2] 3   
[3] 5   



   tord[MAXT], ts[MAXT];
       bool ord(int a, int b){
        return ts[a] > ts[b];    }
    int main(void){
        for(int m, n; scanf("%d %d", &m, &n)){
            bool possible = true;
            FOR(i=0;i<m, i++){ // for each team
                scanf("%d", ts + i); // read team size
                tord[i] = i;
            }
            sort(tord, tord + m, ord)

事情是这样做之后,tord具有按索引排序的数组,即:

tord[] =  
[0] 1   
[1] 3   
[2] 0   
[3] 2   

3 个答案:

答案 0 :(得分:19)

尝试按价值排序(value, index)对进行排序:

public class Pair implements Comparable<Pair> {
    public final int index;
    public final int value;

    public Pair(int index, int value) {
        this.index = index;
        this.value = value;
    }

    @Override
    public int compareTo(Pair other) {
        //multiplied to -1 as the author need descending sort order
        return -1 * Integer.valueOf(this.value).compareTo(other.value);
    }
}

然后,当你打算排序时:

public static void main(String[] args) {
    Pair[] yourArray = new Pair[10];

    //fill the array
    yourArray[0] = new Pair(0, 5); yourArray[1] = new Pair(1, 10); //and so on
    Arrays.sort(yourArray);
}

现在,您有一个按Pair降序排序的value对象数组。每个对象还包含index - 原始数组中的位置。

P上。 S.我在Java中编写了示例,因为问题有java标记。虽然在C++中的想法是相同的,但只有实现有点不同。

答案 1 :(得分:1)

OP海报的例子涉及对整数数组进行排序。如果任何读者具有类似的情况,但具有非基本类型的数组,则以下是用于处理非基元数组的类。该课采用了一种不同的方法。它使原始数组保持不变,而是创建一个索引和排序数组并返回它。

public class IndirectSorter<T extends Comparable<T>> {
    public int[] sort(T args[]) {
        Integer origindex[] = new Integer[args.length];
        int retval[] = new int[args.length];
        for (int i=0; i<origindex.length; i++) {
            origindex[i] = new Integer(i);
        }
        Arrays.sort(origindex, new IndirectCompareClass<T>(args));
        for (int i=0; i<origindex.length; i++) retval[i] = origindex[i].intValue();
        return retval;
    }

    class IndirectCompareClass<T extends Comparable<T>> implements Comparator<Integer> {
        T args[];
        public IndirectCompareClass(T args[]) { this.args = args; }
        public int compare( Integer in1, Integer in2 ) {
            return args[in1.intValue()].compareTo(args[in2.intValue()]);
        }
        public boolean equals( Integer in1, Integer in2 ) {
            return args[in1.intValue()].equals(args[in2.intValue()]);
        }
    }
}

快速调用它可以做到这样的事情:

public static void main(String args[] ) {
    int indexes[] = new IndirectSorter<String>().sort(args);
    for (int i : indexes) {
        System.out.printf("original pos: %d %s\n", i, args[i] );
    }
}

编辑:如果您愿意重新实现Arrays.sort(int [])方法,则可以避免创建和使用Integer对象。这可能很有吸引力。

答案 2 :(得分:0)

以下答案提供了克服问题中解释的问题的主要步骤,但未提供详细信息代码。

  • 您可以创建包含Classvalue两个属性的自定义index。其中value是原始属性值,index是排序前的位置。
  • 创建此ArrayList的{​​{1}}。
  • 使用想要的ClassClass添加已创建的value的新对象。

注意:设置index值的一种可能方法是遍历index并使用循环索引设置Arraylist的值。

  • 根据index属性使用特殊ArraylistComparable进行排序。

现在排序后,您可以通过调用其value属性来了解任何条目的上一个index