使用自然顺序对对象数组进行排序

时间:2013-11-19 15:44:43

标签: arrays sorting

我有一个10000行的数据文件,每行“lastName,firstName middleName social security”,我想用可比较的界面对其进行排序,其中比较基于名称(last,first middle);如果最后,第一和中间名称相同,则使用社会保障作为该记录的辅助排序字段。 我的问题是我正在将每个名称读入一个单独的数组,因此我无法执行上述任务。下面是我如何阅读文件和排序方法的示例。

{       while(fileScanner.hasNextLine())

    {
        //Each String in the line of the data file is read into an array
        Scanner lineScanner = new Scanner (fileScanner.nextLine());

        lastName [i] = lineScanner.next();
        firstName [i] = lineScanner.next();
        middleName [i] = lineScanner.next();
        id [i] = lineScanner.next(); 
        lastName[i] = lastName[i].substring(0, lastName[i].indexOf(','));
                    i++
  }

                    Sorts.selectionSort(lastName, firstName, middleName, id); 

}

//排序方法

public static void selectionSort (Object [] x, Object [] y, Object [] z, Object [] a)
{


    // Make [0 ... i] sorted and <= x [i + 1]  ...x [x.length -1]:
        for (int i = 0; i < x.length -1; i++) 
         {

        int pos = i;
        for (int k = i + 1; k < x.length; k++)
            if (((Comparable)x [k]).compareTo(x [pos]) < 0)

                pos = k;
            swap (x, i, pos);
            System.out.println(x[i]);
    }

    for (int j = 0; j < y.length -1; j++)
    {
        int pos2 = j;
        for (int k = j + 1; k < y.length; k++)
            if (((Comparable)y [k]).compareTo(y [pos2]) < 0)

                pos2 = k;
            swap (y, j, pos2);
            System.out.println(y[j]);

    }
    for (int m = 0; m < z.length -1; m++)
    {
        int pos3 = m;
        for (int k = m + 1; k < y.length; k++)
            if (((Comparable)z [k]).compareTo(z [pos3]) < 0)

                pos3 = m;
            swap (y, m, pos3);
            //System.out.println(z[m]);

    }

    for (int l = 0; l < a.length -1; l++)
    {
        int pos4 = l;
        for (int k = l + 1; k < y.length; k++)
            if (((Comparable)a [k]).compareTo(a [pos4]) < 0)

                pos4 = l;
            swap (y, l, pos4);
            System.out.println(a[l]);

    }   


}

2 个答案:

答案 0 :(得分:2)

您正在使用java,因此请停止使用类似C的结构。使用属性firstName,lastName,middleName,ssn定义对象。为每个人创建一个新对象并将其存储在List(可能是LinkedList或ArrayList)中。

覆盖对象上的equals和hashcode方法。

使用Collections.sort()对列表进行排序。

答案 1 :(得分:0)

创建一个具有名字,姓氏和社会安全号的Person类,在读取输入时,创建Person类的实例并将它们放在ArrayList中。然后你不必担心有多个数组。