2014-05-23 68 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