【问题标题】:Java: Sort string list by a number contained within that string (descending)Java:按字符串中包含的数字对字符串列表进行排序(降序)
【发布时间】:2017-08-11 04:18:59
【问题描述】:

我有一个 .txt 文件,其中包含人们的姓名和他们在游戏中获得的分数,例如。

2 John
6 Matt
etc.

我试图按照得分最高的人(他们名字旁边的数字)的顺序来组织他们。我可以使用子字符串获取整数,然后使用Collections.sort,但我不确定如何将其与名称联系起来。

如果有人有任何聪明的想法,请帮忙!我目前拥有它,因此所有分数/名称都被读入一个 ArrayList,例如:{2 John, 3 Matt}

【问题讨论】:

  • 您可以实现一个“包含”分数和球员姓名的类PlayerScore,并将该类的实例放入您的ArrayList。但是,在对自定义类进行排序时,您可能会遇到另一个问题,但请随时提出另一个问题。
  • 我知道这可能有点矫枉过正,但我​​会将每个名称表示为一个对象,即“2 john”将是一个人员对象,其中一个 int 用于保存数字和字符串名称以保存他们的名字。 C# 结构本来是最适合这个的,但由于 Java 没有结构,在如此小的数据上实现它显然是一种矫枉过正,但它会起作用。那么您可以将所有对象插入到您的 ArrayList 中,然后线性搜索最高得分者并将该人对象存储到另一个列表中,但不要忘记从包含无序数据的 arraylist 中删除最高得分者。
  • 你能贴出你试过的代码吗?

标签: java sorting substring


【解决方案1】:

您可以简单地实现一个自定义Comparator<String> 并在第一个空格处拆分(将拆分限制为2)。我还假设关系应该按词汇(按字母顺序)排序。喜欢,

List<String> al = new ArrayList<>(Arrays.asList("2 John", //
        "3 Matt", "3 Adam Smith"));
al.sort(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        String[] a = o1.split("\\s+", 2); // <-- split on white space, limit 2.
        String[] b = o2.split("\\s+", 2);
        int r = Integer.compare(Integer.parseInt(a[0]), //
                Integer.parseInt(b[0]));
        if (r != 0) {
            return -r;
        }
        return a[1].compareTo(b[1]);
    }
});
System.out.println(al);

哪些输出(我想你想要的)

[3 Adam Smith, 3 Matt, 2 John]

【讨论】:

  • 下午晚些时候试试,看起来很有希望,谢谢!
猜你喜欢
  • 2021-08-12
  • 2021-08-02
  • 2017-01-09
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
相关资源
最近更新 更多