Java中如何先按长度排序再按字母顺序排序数组

10

如何按照长度,然后按字母顺序对数组进行排序?

我有一个带有数字的事物列表,我目前得到的结果是:

Something1 Something10 Something2 Something3

而我想要得到的是:

Something1 Something2 Something3 Something10


1
有没有可能是作业? - Dean J
如果您真正想要一个能够理解数字部分的排序,可以查看https://dev59.com/IXVD5IYBdhLWcg3wDXJ3的答案。 - Paul Tomblin
不,我只是想快速重命名一堆文件。它们已经编号了,但是数字需要稍微调整一下,而文件名的其余部分也需要改变。但是操作系统的自然排序通常返回1 10 11 12 13 14 15 16 17 18 19 2 20等。 - Brian
1
你尝试过在数字前面加上前导零吗?例如,01、02、03、04、05、06、07、08、09、10、11。 - Jeff Davis
6个回答

25
public class MyComparator implements Comparator<String>{
    @Override
    public int compare(String o1, String o2) {  
      if (o1.length() > o2.length()) {
         return 1;
      } else if (o1.length() < o2.length()) {
         return -1;
      }
      return o1.compareTo(o2);
    }
}

然后使用:

Collections.sort(yourList, new MyComparator());

比较器需要 int compareTo(Obj o) 而不是 compare(Object o1, Object o2)。这段代码已经接近正确了。 - Starkey
3
@Starkey: 那是Comparable(可比较的)。这是Comparator(比较器)。你说得很接近了。 - Mark Peters
谢谢,我只是需要很快地对一些带数字的文件名进行排序并重命名。我将它们存储在数组中,所以我不得不将其转换为集合,但这对我的目的起作用了。谢谢! - Brian
@Mark Peters,关于Comparatee怎么样? - Jeff Davis
排序的好方法 + @KeatsPeeks - Maytham Fahmi

10

以下是一个简洁的Java 8解决方案:

List<String> list = Arrays.asList("Something1", "Something10", "Something2", "Something3");
list.sort(Comparator.comparing(String::length).thenComparing(String::compareTo));

或者,不区分大小写的版本:

list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase));

4
创建一个比较器,首先按长度比较,如果长度相同,则使用 String.compareTo() 方法进行比较。

还要注意存在compareToIgnoreCase()方法。 - Mark Peters

1
按长度和字典顺序排序仅适用于所有情况下字符串前缀(即数字之前的部分)长度相同的情况。我认为你可能真正想编写一个比较器,将字符串和数字部分分开,并在字符串上按字母顺序排序,在数字部分上按数字顺序排序。

0

定义一个类来保存你的项目。看起来你想让它成为一个字符串。

对于那个类,你需要定义 Comparable 接口,并将比较逻辑放在它的抽象方法中。

int compareTo(T o)  

例如:

class MyString extends String
{
  @Override
  int compareTo(Object obj)
  {
    // 在这里放入您的逻辑。
    // 如果此项“小于”obj,则返回-1。
    // 如果这个等于 obj,则返回 0
    // 如果这比 obj“大”,则返回 1。
// 先测试长度 if (length() < obj.length()) return -1; if (length() > obj.length()) return 1;
// 长度相同,使用 String 已经定义的字母顺序比较 return super.compareTo(obj); } }

免责声明,我实际上没有测试过这段代码,但它应该接近您想要的。


0
通过使用lambda表达式,Java程序看起来像这样。
import java.util.Arrays;
import java.util.List;

public class Test1 {

    public static void main(String[] args) {
        
        String str = "This is am example";
        List<String> strl = Arrays.asList(str.split(" "));
        strl.sort( (o1,o2)->{
            if(o1.length() > o2.length())      return 1;
            else if(o1.length() < o2.length()) return -1;
            else                               return o1.compareTo(o2);
        });
        System.out.println(strl);

    }
}

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