2014-05-23 66 views
0

你如何對一組相互配對的數組進行排序?例如, 是,如果你有一個學號和學生姓名的數組。我怎樣才能讓學生的名字也調整過來。當你按學號排序時?如何對彼此配對的數組進行排序?

例如我想做什麼的輸出是:

unsorted: 
ID numbers  name  course 
5    jomar  IT 
3    karen  CS 

sorted (by ID numbers) 
ID numbers  name  course 
3    karen  CS 
5    jomar  IT 

我試着使用TreeMap的,但有這個問題,如果ID號的值是相同的,它會覆蓋其他,它會打印這樣的:

sorted (by ID numbers) 
ID numbers  name  course 
3    karen  CS 

在回答Stultuske 我試圖用1個陣列包含ID NUM,名字,當然。 它是這樣的:

for(int i=0;i<array.length;i++){ 
    String [][] storeAllArray = {{array[i]},{array2[i]},{array3[i]}}; 
    System.out.println(storeAllArray[0][0] + " " 
         + storeAllArray[1][0] + " " 
         + storeAllArray[2][0]); 
} 
+3

您不應該有這樣的數組。你應該有一個具有學生實例的數組,它們具有:數字,名稱,他們遵循的課程...... – Stultuske

+0

@Stultuske那麼你將如何分類?我做到了。但我不知道如何分類。我的數組是這樣的: for(int i = 0; i user3658900

+0

請不要在評論中轉儲代碼。只需編輯您的原始帖子。 – azurefrog

回答

0

如果你有一個Collection<Student>,你對它進行排序是這樣的:

Collections.sort(studentList,new Comparator<Student>() { 
    int compareTo(Student s1, Student s2) { 
    return s1.getSomeField().compareTo(s2.getSomeField()); 
) 
}); 

基本上你傳遞一個Comparator(產生內嵌這裏)到Collections.sort()

我強烈建議不要使用並行陣列版本,因爲它真的避免了Java的OO本質。

但是,如果你真的要做到這一點,你必須有第三個數組,它是剛剛從1索引到你的數組中元素的個數,那麼你就必須使用並行索引陣列並使用Arrays.sort()與比較並行數組的值(而不是索引數組)的Arrays.sort()進行排序,然後對遍歷的索引數組執行迭代並打印出與其他數組的索引匹配的元素。像上面那樣正確地做到這一點非常容易。

1
public class Student implements Comparable { 
    private int id; 
    private String name; 
    private String course; 

    public Student(int pid, int pname, int pcourse) { 
     id = pid; 
     name = pname; 
     course = pcourse; 
    } 

    @Override 
    public int compareTo(Object o) { 
     return new Integer(id).compareTo(new Integer(((Student)o).getID())); 
    } 

    public int getID() { return id; } 
    public String getName() { return name; } 
    public String getCourse() { return course; } 
} 

在這一點上,你只是做一個ArrayList(或任何收集你喜歡)的學生,並調用Collections.sort(~initialized ArrayList~);

0

第1部分:定義你的比較如下:

public class MyComparator implements Comparator<Object[]> { 

    @Override 
    public int compare(Object[] o1, Object[] o2) { 
     if ((int) o1[0] > (int) o2[0]) 
      return 1; 
     else if (!((int) o1[0] > (int) o2[0])) 
      return -1; 
     else 
      return 0; 
    } 

} 

部分2:然後按照您的main類中的示例代碼:

public class MyComparatorTest { 

    public static void main(String[] args) { 


    List<Object[]> list = new ArrayList<Object[]>(); 

    Object[] o = new Object[3]; 
    o[0] = 2; 
    o[1] = "TWO"; 
    o[2] = "RR"; 
    list.add(o); 

    o = new Object[3]; 
    o[0] = 3; 
    o[1] = "THREE"; 
    o[2] = "GG"; 
    list.add(o); 

    o = new Object[3]; 
    o[0] = 1; 
    o[1] = "ONE"; 
    o[2] = "TT"; 
    list.add(o); 

    // This sorts your list 
    Collections.sort(list, new MyComparator()); 

    // The following loop is only to show you the sorted list content. 
    for (Object[] obj : list) { 
     for (Object obj2 : obj) { 
      System.out.print(" " + obj2); 
     } 
     System.out.println(); 
    } 

    } 

} 

示例輸出是:

1 ONE TT 
2 TWO RR 
3 THREE GG 
+0

我有一個問題。我沒有數組的修復值。這取決於用戶輸入的內容,包括他們想要輸入多少次。另一件事是根據你的編碼,我只需要一個數組/對象來保存我的學生ID,姓名和課程。它看起來像這樣: Object [] o = {arrayStudent [i]}; 我不能再創建第二個對象,因爲所有輸入的用戶都會進入arrayStudent。如果有10個輸入?我需要10個物體才能比較嗎?或者也許我只是在想它錯了。 @Mohammad – user3658900

+0

是的。你想錯了。你可以使用ONE引用並反覆創建一個對象(創建一個for-loop或其他東西,我的代碼只是一個例子)。我修改了代碼來向你展示我的意思。另外,對於這種情況,您需要了解「比較器」類的功能。 –

+0

所以我應該有這樣一個數組: String arrayALL [] [] = new String [3] [i]; 我會將學號設置爲[0] [i],然後我會將名稱命名爲[1] [i]和當然號[2] [i] ,然後如下操作: Object [] o = new [3]對象; o [0] = arrayALL [0] [i]; o [1] = arrayALL [1] [i]; o [2] = arrayALL [2] [i]; list.add(o); Collections.sort(list,new MyComparator()); – user3658900