【问题标题】:Sort array first by length then alphabetically in Java在Java中先按长度排序数组,然后按字母顺序排序
【发布时间】:2011-03-25 10:49:45
【问题描述】:

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

我有一个带有数字的物品清单,我目前正在得到:

某事1 东西10 东西2 东西3

而我想得到:

Something1Something2Something3Something10

【问题讨论】:

  • 有机会做作业吗?
  • 看看stackoverflow.com/questions/104599/… 的答案,如果你真正想要的是一种理解数字部分的排序。
  • 不,只是有很多我想快速重命名的文件。它们被编号,但数字需要移动一点并且文件名的其余部分会改变。但是操作系统的自然排序一般会返回 1 10 11 12 13 14 15 16 17 18 19 2 20 etc.
  • 您是否尝试过仅在数字中使用前导零?即,01、02、03、04、05、06、07、08、09、10、11。

标签: java arrays sorting


【解决方案1】:
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:这是可比的。这是比较器。不过你很接近。
  • 谢谢,我只需要快速对一些包含数字的文件名进行排序并重命名即可。我将它们放在一个数组中,所以我必须将它转换为一个集合,但这符合我的目的。谢谢!
  • @Mark Peters Comparatee 怎么样?
  • 不错的排序方式 + @KeatsPeeks
【解决方案2】:

这是一个简洁的 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));

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 还要注意compareToIgnoreCase()的存在。
    【解决方案4】:

    仅当字符串前缀(即数字之前的部分)在所有情况下都具有相同的长度时,首先按长度排序然后按词法排序才有效。我相信您可能真的想编写一个比较器,将字符串和数字部分分开,并在字符串上按字母顺序排序,在数字部分按数字排序。

    【讨论】:

      【解决方案5】:

      定义一个类来保存你的项目。似乎你希望它是一个字符串。

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

      int compareTo(T o)

      例如:

      MyString 类扩展 String { @覆盖 int compareTo(对象 obj) { //把你的逻辑放在这里。 // 如果这是“小于”,则返回 -1 obj。 // 如果等于 obj,则返回 0 // 如果这“大于”obj,则返回 1。 // 先测试长度 如果 (长度() obj.length()) 返回 1; // 长度相同,使用 String 定义的字母比较 返回 super.compareTo(obj); } }

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

      【讨论】:

        【解决方案6】:

        通过使用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);
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-11
          • 1970-01-01
          • 2020-09-03
          • 2017-11-17
          • 2013-09-24
          • 1970-01-01
          • 2018-11-02
          相关资源
          最近更新 更多