如何根据两列的值对Java中的二维数组进行排序

时间:2015-11-29 11:12:37

标签: java arrays sorting

我有一个问题,我应该整理数组数组并获取数组的排序索引,我认为一些例子将比仅通过单词描述更好地证明我的问题。所以, 我举几个例子:

1-example:
n=3 
[1, 4] row=0
[2, 5]
[3, 6] row=2
output should be : 0 1 2 (explanation is below)
2-example:
n=5
[8, 9]  row=0
[4, 6]  row=1
[5, 11] row=2
[3, 4]  row=3
[4, 7]  row=4
[2, 6]  row=5
output should be : 3 5 1 4 0 2(explanation is below)

排序标准主要基于第二列的值,首先我应该打印第二列的最小值的索引,在1例子中它是4,它的索引是0。如果我们在第二列中遇到与2-example中相同的值(1和5行相同),那么我们应该比较第一列对应的值并首先打印较小的索引。另一个更精确的问题示例:

n=3
[4, 6]  row=0
[1, 6]  row=1
[2, 6]  row=2
output should be : 1 2 0 

编辑:总共有2列和n行

2 个答案:

答案 0 :(得分:1)

基本上,对于这个问题,我认为任何排序算法都可以。您只需指定compare函数即可比较两个元素。

例如,如果您想要冒充式排序,在您的情况下,使用此算法(伪代码取自Wikipedia):

procedure bubbleSort( A : list of sortable items )
  n = length(A)
  repeat 
    swapped = false
    for i = 1 to n-1 inclusive do
      if A[i-1] > A[i] then /* COMPARE LINE */
        swap( A[i-1], A[i] )
        swapped = true
      end if
    end for
    until not swapped
end procedure

您只需要将COMPARE LINE注释的行上的比较替换为compare函数,该函数将根据您的需要比较您的对象(基于第二个元素,如果相等,则为第一个元素)元素)。

例如,将此行替换为if compare( A[i-1], A[i] ) then

总而言之,只要您提供正确的compare功能,每个排序算法都会有效。

答案 1 :(得分:0)

这是你完整的解决方案试试这个,

public class TwoDimensitnArraySort {
public static void main(String[] args) {
    int ary[][] = {{8, 9},{4, 6},{5, 11},{3, 4},{4, 7},{2, 6}};

    ArrayList<TwoDArray> list = new ArrayList<TwoDArray>();

    for(int i = 0;i<ary.length;i++){
        int k = ary[i][0];
        int v = ary[i][1];
        list.add(new TwoDArray(k, v));
    }

    Collections.sort(list);
    int index = 0;
    for(TwoDArray element : list){
        for(int i = 0;i<ary.length;i++){
            if(element.getKey() == ary[i][0] && element.getValue() == ary[i][1]){
                System.out.print(i + " ");
            }
        }
    }
}
}

class TwoDArray implements Comparable<TwoDArray>{
    int key;
    int value;

    public TwoDArray(int key,int value) {
        this.key = key;
        this.value = value;
    }


    public int getKey() {
        return key;
    }



    public void setKey(int key) {
        this.key = key;
    }



    public int getValue() {
        return value;
    }



    public void setValue(int value) {
        this.value = value;
    }



    public int compareTo(TwoDArray o) {
        if(o.getValue() >= this.getValue()){
            return -1;
        }else if (o.getValue() < this.getValue()){
            return 1;
        }
        if(o.getValue() == this.getValue()){
            if(o.getKey() >= this.getKey()){
                return -1;
            }else if (o.getKey() < this.getKey()){
                return 1;
            }
        }

        return 0;
    };
    @Override
    public String toString() {
        return this.key + ":" + this.value;
    }
}