【问题标题】:Sorting an Arraylist that contains strings with numbers [closed]对包含数字字符串的 Arraylist 进行排序 [关闭]
【发布时间】:2014-05-05 08:14:45
【问题描述】:

我有一个由字符串组成的 ArrayList。这个 ArrayList 包含...

“60 分钟” “120 分钟” “30 分钟”

如果我使用Collections.sort(ArrayList);,它会首先显示“120 分钟”。这是因为“120”中的“1”明显小于“30”中的“3”

有没有一种简单的方法可以对这个 ArrayList 进行排序,使其显示为...

“30 分钟” 《60 分钟》 “120 分钟”

【问题讨论】:

标签: java sorting arraylist


【解决方案1】:

定义您自己的实现Comparator<String> 的类。在compare 方法中,从字符串参数的第一部分提取数字并比较它们,如果第一个数字小于、等于或大于第二个数字,则返回 -1、0 或 1 .

然后您可以将比较器的实例(连同您的ArrayList)传递给Collections.sort

【讨论】:

  • 我的意思只是一种不同的内置方法(如果有的话)。我正在尝试向这一类添加尽可能少的代码。但这对其他人来说是一个完美的答案。谢谢。
  • 这个答案尽可能少的代码。
  • @Zack:然后删除分钟这个词并按没有文本的原始分钟排序。然后稍后恢复文本。看起来很琐碎
  • @Zack 我认为没有内置方法可以解析这种特定格式的字符串,提取字符串第一部分中预期的数字,然后比较它们。这太具体了,无法内置。
  • @staticx 我知道这很简单。我正在从数据库中提取这些值,并且我试图不对任何内容进行硬编码,以防数据库中的某天“60 分钟”更改为“六十”。然后我和我拆分字符串的代码将无法正常工作。但是感谢您的回答!
【解决方案2】:

使用 Java 8,您可以通过以下方式使其成为单行操作:

Collections.sort(list, comparing(s -> Integer.valueOf(s.split("\\s+")[0])));

但是,这仍然需要一些混乱的逻辑来执行比较。

创建一个以int 形式保存信息并实现Comparable 接口的临时类可能会更简洁、更易于维护。

【讨论】:

【解决方案3】:

使用@rgettman 的想法,并假设所有字符串都按照您的示例输入正确格式化,比较本身可能是这样的:

int spcIdx = s1.indexOf(" ");
int i1 = s1.substring(0, spcIdx);
String s1 = s1.substring(spcIdx + 1);

//Repeat for i1 and s2...

return  (((new Integer(i1)).compareTo(i2) * 10) + s1.compareTo(s2));

【讨论】:

  • OP 刚刚发布了一条评论,说 60 可能变成 60,所以如果发生这种情况,这将失败。
  • 呃。太令人沮丧了。对于在发布许多答案后发生巨大变化的问题,应该受到严厉的惩罚。
  • @staticx 您打算如何实现一个无需更多代码即可同时适用于60 minutessixty minutes 的逻辑??
  • @assylias:告诉我吧……这就是我对 OP 的看法。界面变了。
  • 当一个问题像这样完全改变时,在发布了许多答案之后,尽管向 OP 提出了许多问题以确保我们正在做他们想要的,我认为这应该是一个不言而喻的政策让所有回答者对所有其他答案投赞成票,对问题投反对票,投票结束。
猜你喜欢
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 2023-01-05
  • 2017-02-24
  • 2020-02-18
  • 2016-07-01
相关资源
最近更新 更多