Выбор сортировки для строк и целых чисел одновременно - PullRequest
0 голосов
/ 23 октября 2018

Вот задание, которое мне поставили:

Создайте текстовый файл с именем Names_ages.txt со следующим содержанием:

Jones 14
Abrams 15
Smith 19
Jones 9
Alexander 22
Smith 20
Smith 17
Tippurt 42
Jones 2
Herkman 12
Jones 11

Каждая строка - это фамилия человека, за которой следуетпространство, а затем его возраст.Мы хотим отсортировать эти имена в алфавитном порядке, а в случае дублированных имен - по возрастанию.Правильно отсортированный список будет выглядеть следующим образом:

Abrams, 15
Alexander, 22
Herkman, 12
Jones, 2
Jones, 9
Jones, 11
Jones, 14
Smith, 17
Smith, 19
Smith, 20
Tippurt, 42

Вот мои (рабочие) методы сортировки выбора для строк и целых соответственно:

private static void sort(String[] a) {

    String min;
    int minIndex;

    for (int i = 0; i < a.length; i++) {
        min = a[i];
        minIndex = i;
        // find minimum
        for (int j = i + 1; j < a.length; j++) {
            // salient feature
            if (a[j].charAt(0) < min.charAt(0)) {
                min = a[j];
                minIndex = j;
            }
        }
        a[minIndex] = a[i]; // swap
        a[i] = min;
    }

}

private static void sort(int[] a) {

    int min, minIndex;

    for (int i = 0; i < a.length; i++) {
        min = a[i];
        minIndex = i;
        // find minimum
        for (int j = i + 1; j < a.length; j++) {
            // salient feature
            if (a[j] < min) {
                min = a[j];
                minIndex = j;
            }
        }
        a[minIndex] = a[i]; // swap
        a[i] = min;
    }

} 

Я могу сортировать имена в текстефайл, а затем цифры после, но возраст заканчивается в соответствии с неправильными людьми.Вот мой класс с основным методом:

Scanner scanner = new Scanner(new File("/Users/Krish/IdeaProjects/Lessons/src/Lesson40/MultipleKey/NamesAges.txt"));
    String text[] = new String[100];
    int index = 0;

    while (scanner.hasNext()) {
        text[index++] = scanner.nextLine();
    }

    scanner.close();

    String name;
    String[] names = new String[index];
    int age;
    int[] ages = new int[index];

    for (int i = 0; i < index; i++) {
        Scanner line = new Scanner(text[i]);
        name = line.next();
        names[i] = name;
        age = line.nextInt();
        ages[i] = age;
    }

    sort(names);
    sort(ages);

    for (int i = 0; i < index; i++) {
        System.out.println(names[i] + ", " + ages[i]);
    }

Любая помощь приветствуется, спасибо.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018
public static void main(String[] args) throws IOException {

    Scanner scanner = new Scanner(new File("/Users/Krish/IdeaProjects/Lessons/src/Lesson40/MultipleKey/NamesAges"));
    String[] text = new String[100];
    int index = -1;

    while (scanner.hasNext()) {
        text[++index] = scanner.nextLine();
    }

    scanner.close();

    Scanner line;
    String[] name = new String[100];
    int[] age = new int[100];

    for (int i = 0; i <= index; i++) {
        line = new Scanner(text[i]);
        name[i] = line.next();
        age[i] = line.nextInt();
    }

    String minName;
    int minAge;
    int minIndex;

    for (int i = 0; i <= index; i++) {
        minName = name[i];
        minAge = age[i];
        minIndex = i;
        for (int j = i + 1; j <= index; j++) {
            if (name[j].compareTo(minName) == 0) {
                if (age[j] < minAge) {
                    minName = name[j];
                    minAge = age[j];
                    minIndex = j;
                }
            } else if (name[j].compareTo(minName) < 0) {
                minName = name[j];
                minAge = age[j];
                minIndex = j;
            }
        }
        name[minIndex] = name[i];
        name[i] = minName;
        age[minIndex] = age[i];
        age[i] = minAge;
    }

    for (int j = 0; j <= index; j++) {
        System.out.println(name[j] + ", " + age[j]);
    }

}
0 голосов
/ 23 октября 2018
  1. Создание класса POJO Person, реализующего Comparable<Person>
  2. После анализа сохраните Person экземпляров в коллекции, скажем List<Person>
  3. Сортируйте коллекцию

-

public class PersonTest {
    static class Person implements Comparable<Person> {
        private static final Comparator<Person> COMPARATOR = Comparator
                .comparing(Person::getName)
                .thenComparingInt(Person::getAge);

        final String name;
        final int age;

        public static Person parse(String rec) {
            final String[] parts = rec.split(" ");
            return new Person(parts[0], Integer.valueOf(parts[1]));
        }

        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }

        @Override
        public int compareTo(Person o) {
            return COMPARATOR.compare(this, o);
        }
    }

    @Test
    public void testSorting() throws Exception {
        final Person[] sortedPersons = Files.lines(Paths.get("/path/to/file.txt"))
                .map(Person::parse)
                .sorted() // sort it here
                .toArray(Person[]::new);

        // or instead, sort it here with your custom algorithm
        // using Person.COMPARATOR for comparison
    }
}
...