在Java中使用文本文件中的字符串对数字进行排序

时间:2018-12-01 22:15:19

标签: java arrays string int

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

1 one
2 two
4 four
10 ten

来自于以下内容的input.txt:

2 two
4 four
1 one
10 ten

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

   }

}

5 个答案:

答案 0 :(得分:3)

由于将字符串和数字保留在单独的数组中,因此,对数组之一进行排序后,就失去了字符串-数字对之间的关​​系。

正如@Andrew S所提到的,执行此操作的方法是创建一个新类(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); } } 字段进行比较。

subprocess.call(f'"\\\\{computer}\\Share\\ProcessPreLayouts.exe" -filepaths="{jsons}"')

答案 1 :(得分: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创建自己的自定义类。

答案 2 :(得分:0)

您不能对一个数组进行排序,因为您失去了关系(未分配数组中的哪一行属于已排序的数组)。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

Map

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

SortedMap

如果您希望密钥按排序顺序保留,请使用SortedMap子界面。

TreeMap

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

使用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,因此按数字排序。