【问题标题】:Sorting multi-type string ArrayList in Java based on IntegersJava中基于整数的多类型字符串ArrayList排序
【发布时间】:2019-07-28 15:11:06
【问题描述】:

我有一个这样的数据集:

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); 仅适用于单一类型的数据。但是,在我的情况下,我有多种类型的字符串(字符串整数),并且排序应该基于 Integers。那么,有没有办法解决这个问题呢?

【问题讨论】:

  • 正确的方法不是使用字符串数组,而是将每一行解析为一个适当的对象,该对象具有 ID、名称和年份,并列出该对象。然后您可以使用Comparator 进行排序。
  • 让我看看这个
  • 你的每个列表的String数组长度是固定的吗?

标签: java sorting arraylist


【解决方案1】:

考虑为您的数据定义一个模型类 - 我们称之为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);

【讨论】:

  • 这似乎是一个更好的解决方案
【解决方案2】:

通过使用 java-8 lambda 表达式,编写自定义 Comparator 来比较 Integer 值并使用 Integer.valueOfString 转换为 Integer

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]

【讨论】:

【解决方案3】:

这可行:

  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;
              }
            });
      }

【讨论】:

  • 既然有Integer.compare 方法,为什么还要写那么长的if 语句?
  • 哦,你是对的,这将大大减少上述方法的冗长。没打到我。
猜你喜欢
  • 1970-01-01
  • 2018-03-31
  • 2015-10-06
  • 2016-09-06
  • 2018-04-23
  • 2017-06-07
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
相关资源
最近更新 更多