4

目标是有一个排序的 input.txt,例如:

1 one
2 two
4 four
10 ten

从 input.txt 中:

2 two
4 four
1 one
10 ten

到目前为止,在我的代码中,我已经对数字数组进行了排序,现在我必须更改 String 数组,因为它与 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

   }

}
4

5 回答 5

3

因为您将字符串和数字保存在单独的数组中,所以一旦您对其中一个数组进行排序,您就会失去字符串-数字对之间的关​​系。

正如@Andrew S 所提到的,这样做的方法是创建一个新类 ( Pair),其中包含数字和字符串。您将从文件中读取类型为对象的数组Pair,而不是分别读取数字和字符串。对数组进行排序时,数字及其对应的文本将一起排序。

为了能够对包含 type 元素的数组进行排序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);
    }

}
于 2018-12-01T22:46:04.127 回答
2

我想推荐一种更简单的方法来阅读您的文本文件并对项目进行排序。

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同时包含整数值和字符串值,以便在排序后我们可以维护相关数据。

另一方面,您可能希望使用@Andrew S 提到的这两个字段创建自己的自定义类,而不是SimpleEntry.

于 2018-12-01T22:33:24.200 回答
0

您无法对一个数组进行排序而没有另一个数组,因为您丢失了关系(未排序数组中的哪一行属于已排序的数组)。

要解决此问题,您可以在地图中维护关系,但更聪明的是创建类并排序此类(可比/比较器)的实例。

于 2018-12-01T22:21:13.770 回答
0

为此,您必须将整数链接到字符串,您可以在读取文件中的整数作为键和单词作为值时使用保存的 HashMap 来执行此操作。对数字数组进行排序后,您可以简单地循环遍历数字数组并创建一个新的字符串数组,将值放入其中的整数,该整数之前保存在 HashMap 中。

另一种方法是编写自己的排序算法并在更改整数数组时更改字符串数组。

于 2018-12-01T22:24:30.840 回答
0

当您跟踪一对值时,一个值导致另一个值,这通常称为键值或属性值对

Map

Map在 Java 中,我们使用接口逐个跟踪一个值。当您放入一个键值对时,您可以稍后通过指定键来检索该值。就像字典一样,一个词导致一个定义。

SortedMap

如果您希望密钥按排序顺序保存,请使用SortedMap子接口。

TreeMap

SortedMap与 Java 捆绑在一起的一种实现是TreeMap类。

使用Java 泛型,您可以指定用作键的数据类型和用作值的数据类型。在我们这里的例子中,这将是Integerand String

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

当您收集输入时,将作为数字的输入解析为Integer. 然后将其伙伴String对象存储到TreeMap.

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

map.put( integer , string ) ;

当您循环这些条目时,它们将按照键的排序顺序呈现给您,因为它们是类型,所以按数字排序Integer

于 2018-12-01T23:03:47.007 回答