2013-11-19 5 views
1

У меня есть файл данных из 10000 строк со следующими строками: «lastName, firstName middleName social security». Я хочу отсортировать его с помощью сопоставимого интерфейса, где сравнение основано на имени (последний, первый средний); если последние, первые и средние имена совпадают, используйте социальную защиту в качестве вторичного поля сортировки для этой записи. Моя проблема в том, что я читаю каждое имя в отдельный массив, и поэтому я не могу выполнить вышеупомянутую задачу. Ниже приведен пример того, как я читаю файл и метод сортировки.Сортировка массива объектов с использованием естественного порядка

{ в то время как (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]); 

    } 


} 

ответ

0

Создайте класс Person с именем, фамилией и номером социального страхования, а при чтении ввода создайте экземпляры класса Person и поместите их в ArrayList. Тогда вам не нужно беспокоиться о наличии нескольких массивов.

2

Вы используете Java, поэтому отказаться от использования C-подобных структур. Определить объект со свойствами firstName, lastName, middleName, ssn. Создайте новый объект для каждого пользователя и сохраните его в списке (возможно, LinkedList или ArrayList).

Переопределить методы equals и hashcode на вашем объекте.

Используйте Collections.sort(), чтобы отсортировать список.

+0

Вы избили меня до этого :) –

Смежные вопросы