目标是拥有一个排序的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
}
}
答案 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,指定要用作键的数据类型和要用作值的数据类型。在我们这里的情况下,将是Integer
和String
。
SortedMap< Integer , String > map = new TreeMap<>() ;
在收集输入内容时,请将输入内容解析为Integer
。然后将其与String
对象一起存储到TreeMap
中。
Integer integer = Integer.getInteger( "1" ) ;
String string = "one" ;
map.put( integer , string ) ;
当您循环这些条目时,它们将按键的排序顺序显示给您,因为它们的类型为Integer
,因此按数字排序。