2015-11-29 150 views
0

我有一個問題,我應該對數組進行排序並獲得數組的排序索引,我認爲一些示例會比單純描述更好地展示我的問題。所以, 我提出了幾個例子:如何根據兩列的值對Java中的二維數組進行排序

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列中相同的值(第1行和第5行相同),那麼我們應該比較第一列的相應值並首先打印較小的索引。問題的另一個更精確的例子:

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

編輯:總是有2列和n行

+1

你嘗試過什麼? –

+0

是的,如果你想我可以告訴你我的嘗試,但在這裏我描述了問題的一部分,實際的問題是略有不同,所以代碼 – Humoyun

+0

每當你提供正確的「比較」功能,每個排序算法將工作。 – jeerbl

回答

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; 
    } 
} 
+0

感謝您花時間在問題上 – Humoyun

+0

@Humoyun耶歡迎 –

+1

「給一個男人一條魚,你喂他一天;教一個男人去釣魚,你給他一輩子的食物「。你剛給那個男人一條魚。 – jeerbl

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函數,就可以使用每種排序算法。

+0

這是對的,但我也應該跟蹤索引不只是價值觀,我面臨的主要問題是排序後我失去了索引初始位置排序 – Humoyun

相關問題