Сортировка чисел со строками в текстовом файле на Java - PullRequest
0 голосов
/ 02 декабря 2018

Цель состоит в том, чтобы иметь отсортированный файл input.txt, такой как:

1 one
2 two
4 four
10 ten

Из файла input.txt:

2 two
4 four
1 one
10 ten

Пока в моем коде я отсортировалмассив чисел и теперь я должен изменить массив строк, так как он связан с массивом num.Как мне это сделать?

import java.util.*;
import java.io.*;
//Noah Cavazos

public class SortingNumbers{
   public static void main(String[] args) throws FileNotFoundException {
      Scanner fin = new Scanner(new File("input.txt"));
      int[] nums = new int[100];
      String[] texts = new String[100];
      int cnt = 0;
      while(fin.hasNextInt()){
         nums[cnt] = fin.nextInt();
         texts[cnt] = fin.nextLine();
         cnt++;
      }
      int[] Numbers = new int[cnt];
      String[] Words = new String[cnt];
      for(int i = 0; i < Numbers.length; i++){
         Numbers[i] = nums[i];
         Words[i] = texts[i];
         //System.out.println(Numbers[i] + Words[i]);
      }
      Arrays.sort(Numbers);
      //Arrays.sort(Words); < Alphabetically

   }

}

Ответы [ 5 ]

0 голосов
/ 02 декабря 2018

Когда вы отслеживаете пару значений, одно значение ведет к другому значению, которое обычно называют ключ-значение или пара атрибут-значение .

Map

В Java мы отслеживаем одно значение за другим, используя интерфейс Map.Когда вы вводите пару ключ-значение, вы можете позднее получить значение, указав ключ.Как словарь, где слово приводит к определению.

SortedMap

Если вы хотите, чтобы ключи находились в отсортированном порядке, используйте подчиненный интерфейс SortedMap.

TreeMap

Одной из реализаций SortedMap, поставляемых в комплекте с Java, является класс TreeMap.

Используя Generics Java , вы указываете тип данных для использования в качестве ключей и тип данных для использования в качестве значений.В нашем случае это будет Integer и String.

SortedMap< Integer , String > map = new TreeMap<>() ;

Когда вы соберете свои входные данные, проанализируйте входные данные, которые должны быть числами, как Integer.Затем сохраните вместе с партнером String объект в TreeMap.

Integer integer = Integer.getInteger( "1" ) ;
String string = "one" ;

map.put( integer , string ) ;

Когда вы зацикливаете эти записи, они будут представлены вам в отсортированном порядке ключей, отсортированных по номерам, потому что они имеют тип Integer.

0 голосов
/ 02 декабря 2018

Поскольку вы храните строки и числа в отдельных массивах, после сортировки одного из массивов вы теряете отношения между парами строк-номеров.

Как упоминалось @Andrew S, путь ксделать это, чтобы создать новый класс (Pair), в котором вы храните как число, так и строку.Вы будете читать из файла в массив объектов типа Pair, вместо того, чтобы читать числа и строки отдельно.Когда массив отсортирован, числа и соответствующие им тексты будут отсортированы вместе.

Чтобы иметь возможность сортировать массив, содержащий элементы типа Pair, нам нужно указать, как именно сравнивать две пары.Вот тут и приходит Comparator. Он сообщит функции сортировки критерии, по которым будут сравниваться объекты в массиве.В этом случае два Pair объекта сравниваются по их number полям.

public class Pair {

  private int number;
  private String text;
  // getters and setters, constructor, toString() etc.
}


public static void main(String[] args) throws FileNotFoundException{
    Scanner fin = new Scanner(new File("input.txt"));
    int[] nums = new int[100];
    String[] texts = new String[100];
    int cnt = 0;
    while(fin.hasNextInt()){
        nums[cnt] = fin.nextInt();
        texts[cnt] = fin.nextLine();
        cnt++;
    }
    Pair[] pairs = new Pair[cnt];
    for(int i = 0; i < cnt; i++){
        pairs[i] = new Pair(nums[i], texts[i]);
    }
    Arrays.sort(pairs, new Comparator<Pair>() {
        @Override
        public int compare(Pair o1, Pair o2) {
            return Integer.compare(o1.getNumber(), o2.getNumber());
        }
    });
    for (Pair p: pairs) {
        System.out.println(p);
    }

}
0 голосов
/ 02 декабря 2018

Чтобы сделать это, вы должны связать целые числа со строками, вы можете сделать это с помощью HashMap, в котором были сохранены данные, когда вы читаете файл в целых числах как ключ, а слово как значение.После сортировки массива чисел вы можете просто циклически перебирать массив чисел и создавать новый массив строк, в котором вы помещаете значение в целое число, которое вы сохранили ранее в HashMap.

Другой способ -написать свой собственный алгоритм сортировки и изменить массив строк так же, как и массив целых чисел.

0 голосов
/ 02 декабря 2018

Я хотел бы рекомендовать более простой подход для чтения вашего текстового файла и сортировки элементов.

List<SimpleEntry<Integer, String>> result;
try (Stream<String> stream = Files.lines(Paths.get("input.txt"))) {
   result = stream.map(s -> s.split("\\s"))
                  .map(a -> new SimpleEntry<>(Integer.parseInt(a[0]), a[1]))
                  .sorted(Comparator.comparingInt(SimpleEntry::getKey))
                  .collect(Collectors.toCollection(ArrayList::new));
} catch (IOException e) { e.printStackTrace(); }

Это решение использует SimpleEntry, чтобы содержать как целочисленное значение, так и значение String, чтобы послесортируя мы можем поддерживать связанные данные.

С другой стороны, вы можете создать свой собственный класс с этими двумя полями, как указано @Andrew S вместо SimpleEntry.

0 голосов
/ 02 декабря 2018

Вы не можете сортировать один массив без другого, потому что вы потеряли отношения (какая строка в несортированных массивах принадлежит одной в отсортированном).

Чтобы исправить это, вы можете сохранить связь на карте, но умнеесоздать класс и отсортировать экземпляры такого класса (Comparable / Comparator).

...