我有一个问题,我应该整理数组数组并获取数组的排序索引,我认为一些例子将比仅通过单词描述更好地证明我的问题。所以, 我举几个例子:
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行
答案 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;
}
}