【问题标题】:Sorting Numbers with Strings in text file in Java在 Java 中使用字符串对文本文件中的数字进行排序
【发布时间】:2019-05-03 16:05:45
【问题描述】:

目标是有一个排序的 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

   }

}

【问题讨论】:

  • 另一种方法是创建一个包含数值和字符串值的类,然后根据类中的数值进行排序。此外,由于不知道输入中有多少项,请考虑使用列表而不是数组。

标签: java arrays string int


【解决方案1】:

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

正如@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);
    }

}

【讨论】:

  • 好答案。提示:无需编写Pair 类。 Java 已经提供了一个类型安全的接口Map.Entry 和几个实现,one mutableone not。见this Question
  • 最好使用Integer.compare(o1.getNumber(), o2.getNumber()) 而不是o1.getNumber() - o2.getNumber()
【解决方案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 创建自己的自定义类。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        当您跟踪一对值时,一个值导致另一个值,即通常称为key-value or attribute-value pair

        Map

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

        SortedMap

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

        TreeMap

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

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

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

        当您收集输入时,将输入解析为Integer。然后将其伙伴String 对象存储到TreeMap 中。

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

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

        【讨论】:

          猜你喜欢
          • 2018-04-02
          • 1970-01-01
          • 1970-01-01
          • 2021-11-15
          • 1970-01-01
          • 2021-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多