基于整数的Java多类型字符串ArrayList排序

5

我有这样一个数据集:

1,JOHN,1934
2,TERENCE,1914
3,JOHN,1964
4,JOHN,1904
5,JOHN,1924
6,JOHN,1954
7,JOHN,1944
8,JOHN,1984
9,JOHN,1974
10,JOHN,1994

我已经将以下文本文件中的内容加载到了String[]类型的ArrayList中:

ArrayList<String[]> records = new ArrayList<>();
String fileLocation = System.getProperty("user.dir");
String dataPath = fileLocation + File.separator + "boys-names.txt";
try {
    try (BufferedReader br = new BufferedReader(new FileReader(dataPath))) {
        String line;
        while ((line = br.readLine()) != null) {
            String[] values = line.split(",");
            records.add(values);
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

我希望将数据集按照递增的年份进行排序,如下所示:
4,JOHN,1904
2,TERENCE,1914
5,JOHN,1924
1,JOHN,1934
7,JOHN,1944
6,JOHN,1954
3,JOHN,1964
9,JOHN,1974
8,JOHN,1984
10,JOHN,1994

问题: ArrayList 的内置排序方法 Collections.sort(list); 只能对单一类型的数据进行排序。但是,在我的情况下,我有包含多种类型(字符串-整数)的字符串,并且排序应该基于 整数。那么,有没有办法解决这个问题?


5
正确的方法不是使用字符串数组,而是将每行解析为一个包含ID、名称和年份的适当对象,并创建该对象的列表。然后可以使用“比较器”进行排序。 - RealSkeptic
让我看一下。 - user1773603
你的字符串数组中每个列表的长度是否固定? - dassum
3个回答

5
考虑为您的数据定义一个模型类 - 让我们称之为MyData
public class MyData {
    private long id;
    private String name;
    private Year year;

    //getters setters constructor
}

如果最后一个整数值代表一年,为什么不直接使用java.time.Year呢?然后,您可以使用List::sort方法对此列表进行排序,并传递一个比较器:
Comparator<MyData> comparator = Comparator.comparing(MyData::getYear);

myDataList.sort(comparator);

1
这似乎是一个更好的解决方案。 - Kavitha Karunakaran

1
使用Java-8 Lambda表达式编写自定义比较器Comparator,比较Integer值,并使用Integer.valueOfString转换为Integer。"Original Answer"翻译成"最初的回答"。
List<String[]> list = new ArrayList<String[]>();

String[] ar1 = {"1","JOHN","1934"};
String[] ar2 = {"2","TERENCE","1914"};

list.add(ar1);
list.add(ar2);

list.sort((c1,c2)->Integer.valueOf(c1[2]).compareTo(Integer.valueOf(c2[2])));

list.forEach(i->System.out.println(Arrays.toString(i)));

输出

[2, TERENCE, 1914]
[1, JOHN, 1934]

Arrays.toString(i) 是什么?我想要你的解决方案,而不是模型类。 - user1773603
1
这是打印Array的方法 https://dev59.com/DHRC5IYBdhLWcg3wG9Nb @5377037 - Ryuzaki L

0

这样做可以:

  public static void main(String[] args) {
    List<String[]> records = new ArrayList<>();
    records.add(new String[] {"1", "John", "1934"});
    records.add(new String[] {"2", "Terence", "1914"});

        Collections.sort(
            records,
            (o1, o2) -> {
              Integer year_o1 = Integer.parseInt(o1[2]);
              Integer year_o2 = Integer.parseInt(o2[2]);
              if (year_o1 < year_o2) {
                return -1;
              } else if (year_o1 > year_o2) {
                return 1;
              } else {
                return 0;
              }
            });
      }

2
为什么要写那么长的 if 语句,当有一个 Integer.compare 方法呢? - RealSkeptic
哦,你说得对,那会大大减少上述方法的冗长程度。我没想到。 - Prashant Pandey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接