【问题标题】:Sort ArrayList alphabetically by value after a comma in each String [closed]在每个字符串中的逗号后按值的字母顺序对 ArrayList 进行排序 [关闭]
【发布时间】:2017-01-24 09:32:39
【问题描述】:

我有一个包含如下字符串的 ArrayList:

  • 项目 1:一些文字,安娜贝尔
  • Item2:一些文字,James
  • 项目 3:一些文字,康纳

我想按每个字符串中逗号后的值按字母顺序对 ArrayList 进行排序。

我怎样才能做到这一点?

    ArrayList<String> lineList = new ArrayList<>();

    // New BufferedReader.
    BufferedReader reader = new BufferedReader(new FileReader(
            file));

    // Add all lines from file to ArrayList.
    while (true) {
        String line = reader.readLine();
        if (line == null) {
            break;
        }
        lineList.add(line);
    }

    // Close it.
    reader.close();

    // Print each line.
    for (String line : lineList) {
        System.out.println(line);
    }

【问题讨论】:

  • 您的文件是“csv”吗?如果是,则需要小心,因为逗号可以包含在值中,例如“'Some,text', Annabelle”。
  • 不,它是一个 txt 文件,但是我理解那里的担忧。谢谢!
  • 如果你的文件很大,那么创建已经排序的列表而不是在内存中排序会很方便。看我的回答。
  • 好的,我会抽时间测试一下。感谢您的帮助!

标签: java arrays string arraylist


【解决方案1】:

ComparatorCollections.sort() 方法一起使用。

例如:

Collections.sort(lineList, new Comparator<String>{
    public int compare(String str1, String str2) {
        String actual1 = str1.split(",")[1];
        String actual2 = str2.split(",")[1];

        return actual1.compare(actual2);
    }
});

您可能需要某种方法来确保您实际提取字符串的正确部分,以防有零个或多个逗号。例如,您可以将 substring()lastIndexOf() 结合使用,正如 IQV 所述。

【讨论】:

  • "您可能需要某种方式来确保..." 或者如果唯一的逗号位于末尾,例如Foo,.
【解决方案2】:
import java.util.*;

public class Test {
    public static void main(String... args) {
        List<String> list = new ArrayList<>();
        list.add("zzz, abc");
        list.add("yy, ghi");
        list.add("x, def");
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String lhs, String rhs) {
                return filter(lhs).compareTo(filter(rhs));
            }

            private String filter(String s) {
                // consider the first comma
                return s.replaceFirst("^.*?, ", "");
                // to consider the last comma instead:
                // return s.replaceFirst("^.*, ", "");
            }
        });
        for (String s : list)
            System.out.println(s);
    }
}

输出是:

zzz, abc
x, def
yy, ghi

【讨论】:

    【解决方案3】:

    这是使用 Java 8 的单行代码:

    lineList.sort((String s1, String s2) -> s1.split(",")[1].compareTo(s2.split(",")[1]));
    

    【讨论】:

      【解决方案4】:

      列表填充后不要排序,动态排序:

      public static void main(String[] args) throws IOException {
              Set<String> lines = new TreeSet<>(Comparator.comparing(o -> o.substring(o.indexOf(','))));
      
              // New BufferedReader.
              BufferedReader reader = new BufferedReader(new FileReader("sample.txt"));
      
              // Add all lines from file to ArrayList.
              while (true) {
                  String line = reader.readLine();
                  if (line == null) {
                      break;
                  }
                  lines.add(line);
              }
      
              // Close it.
              reader.close();
      
              // Print each line.
              for (String line : lines) {
                  System.out.println(line);
              }
          }
      

      【讨论】:

        【解决方案5】:

        使用 Java 8 的单行变体:

        Collections.sort(list, Comparator.comparing(s -> s.substring(s.lastIndexOf(","), s.length())));
        

        或更短

        list.sort(Comparator.comparing(s -> s.substring(s.lastIndexOf(","), s.length())));
        

        【讨论】:

          【解决方案6】:

          正如 jesper 所说,您需要一个比较器。在此 Comparator 中,使用 lastIndexOf(',') 方法识别 forname。

          【讨论】:

            猜你喜欢
            • 2017-01-27
            • 1970-01-01
            • 2017-05-22
            • 2019-08-02
            • 2013-10-28
            • 1970-01-01
            • 2016-03-11
            • 2017-10-04
            • 2021-04-01
            相关资源
            最近更新 更多