Java 按字符串中的第二个单词对ArrayList排序

Java 按字符串中的第二个单词对ArrayList排序,java,arrays,arraylist,Java,Arrays,Arraylist,我现在有一个.txt文件,需要根据里面的内容读取和输出数据。我目前已打开该文件,并将文件中的每一行保存到ArrayList中 txt文件是这样设置的 2380213012999 150843432大卫死亡 4327482397487439857934858约翰还活着 3857948998092222783749887马丁杀死了凯利 3857948998092222783749887约翰杀了大卫 现行代码 { try { File file = new File("i

我现在有一个.txt文件,需要根据里面的内容读取和输出数据。我目前已打开该文件,并将文件中的每一行保存到ArrayList中

txt文件是这样设置的

  • 2380213012999 150843432大卫死亡
  • 4327482397487439857934858约翰还活着
  • 3857948998092222783749887马丁杀死了凯利
  • 3857948998092222783749887约翰杀了大卫
现行代码

 {
    try {
        File file = new File("input.txt");
        FileReader fileReader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        StringBuffer stringBuffer = new StringBuffer();
        String line;
        ArrayList<String> txtline = new ArrayList<String>();
        while ((line = bufferedReader.readLine()) != null) {
            txtline.add(line);
            System.out.println(txtline);
        }

        fileReader.close();
        System.out.println(stringBuffer.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}
{
试一试{
File File=新文件(“input.txt”);
FileReader FileReader=新的FileReader(文件);
BufferedReader BufferedReader=新的BufferedReader(文件阅读器);
StringBuffer StringBuffer=新的StringBuffer();
弦线;
ArrayList txtline=新的ArrayList();
而((line=bufferedReader.readLine())!=null){
txtline.add(行);
System.out.println(txtline);
}
fileReader.close();
System.out.println(stringBuffer.toString());
}捕获(IOE异常){
e、 printStackTrace();
}
}
}

我只是想知道是否有办法按第二个大数字对每行文本进行排序,我已经查找过了,但似乎什么也找不到。正确方向上的一点或一些指导将是令人惊讶的,因为我目前正被难倒,因为我需要这样做,然后才能继续前进。

将此放在您的while循环之后

java.util.Collections.sort(txtLine, new Comparator<String>() {
    public void compare(String lineA, String lineB) {
        String wordA2 = lineA.split(" ")[1];
        String wordB2 = lineB.split(" ")[1];
        return wordA2.compareTo(wordB2);
    }
});

您可以通过创建列表流来完成手头的任务,将
比较器
对象传递给
排序
方法来定义排序键,然后将其收集到
数组列表

数字比较:

txtline = txtline.stream()
                 .sorted(Comparator.comparingLong((String e) -> Long.parseLong(e.split(" ")[1])))                             
                 .collect(Collectors.toCollection(ArrayList::new));
按字符串进行比较:

txtline = txtline.stream()
                 .sorted(Comparator.comparing((String e) -> e.split(" ")[1]))
                 .collect(Collectors.toCollection(ArrayList::new));

通常定义一个
比较器
实现,用于将对象排序为非其自然顺序(包括如果它们没有自然顺序)。您可以将这种
比较器的实例与
集合.sort()一起使用来对
列表进行排序
。但是为了提高效率,我建议您提前解析排序键,并将它们与相应的字符串一起存储在您为此定义的类的对象中。然后对它们进行排序。
txtLine.sort(Comparator.comparing(line->line.split(“”[1])顺便说一句,如果它是按数字排序的话,这就行不通了。@shmosel你说得对。。。但从问题中的数据格式来看,这似乎不是问题。是的,我查看了比较器,但无法完全理解它,因此需要更多的解释,而且我希望它们按照字符串中的第二个数字进行数字排序,这可能吗?谢谢你这么快回复,顺便说一句@如果它们的长度相等,您可以将它们作为字符串进行排序。这非常有效,谢谢所以这会将arraylist中的每个对象拆分,并按空格将每个对象拆分为一个数组,然后对数组中的第二个对象进行排序?我的想法正确吗?我只是想完全理解它!谢谢,顺便说一句@JorD是的,所以我们基本上提取每行的第二个数字,方法是用
分隔符将其拆分,并取第二个元素,然后按提取的键进行排序。另外,你可以通过接受答案来表示感谢;-)
txtline = txtline.stream()
                 .sorted(Comparator.comparing((String e) -> e.split(" ")[1]))
                 .collect(Collectors.toCollection(ArrayList::new));