【问题标题】:Sort ArrayList of strings by length按长度对字符串的 ArrayList 进行排序
【发布时间】:2011-11-26 09:46:29
【问题描述】:

我想按长度排序字符串的 ArrayList,但不只是按数字顺序。

例如,列表中包含以下单词:

cucumber
aeronomical
bacon
tea
telescopic
fantasmagorical

它们需要按长度不同排序为一个特殊的字符串,例如:

intelligent

所以最终列表看起来像这样(括号中的差异):

aeronomical     (0)
telescopic      (1)
fantasmagorical (3) - give priority to positive differences? doesn't really matter
cucumber        (3)
bacon           (6)
tea             (8)

【问题讨论】:

标签: java arraylist sorting


【解决方案1】:

如果您使用的是 Kotlin,则可以使用此代码

    var A = ArrayList<String>()
    A.add("Alen")
    A.add("Nymar")
    A.add("Ronaldo")
    A.add("Totianas")
    A.add("Ted")
    A.add("Sara")

    Collections.sort(A, object : Comparator<String?> {
        override fun compare(p0: String?, p1: String?): Int {
            return (p1!!.length - p0!!.length)
        }
    })

    System.out.println(A)

【讨论】:

    【解决方案2】:
    Collections.sort(list, (a, b)->Integer.compare(a.length(), b.length()));
    

    【讨论】:

      【解决方案3】:
      List<String> list = Arrays.asList("geeksforgeeks", "geeksfor", "geeks");
      Collections.sort(list, new Comparator<String>(){
             public int compare(String s1, String s2){
                      return s1.length() - s2.length();
             }
      });
      

      【讨论】:

        【解决方案4】:
        • 字符串升序
        class StringLengthListSort implements Comparator<String>{
        
            @Override
            public int compare(String s1, String s2) {
            return s1.length() - s2.length();
            }
        
            /**
             * @param args
             */
            public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            StringLengthListSort ss = new StringLengthListSort();
            list.add("ram");
            list.add("rahim");
            list.add("ramshyam");
            Collections.sort(list, ss);
            System.out.println(list);
            }
        
        }
        

        【讨论】:

          【解决方案5】:
          The shortest code for this-
          
          public static void main(String... str) {
                  List.of("am", "I", "Best", "the").stream().sorted((a, b) -> a.length() - b.length())
                          .forEach(System.out::println);
              }
          

          【讨论】:

            【解决方案6】:

            我有一个通过 lambda 表达式解决的类似问题:

            listBeforeSorting.sort((s1, s2) -> s1.length() - s2.length());
            

            这样,我们将得到按长度(升序)排序的列表。

            【讨论】:

              【解决方案7】:

              简单的 Java8 解决方案,仅包含 Comparator 和 Method 参考: Stream.of(list).flatMap(Collection::stream).sorted(Comparator.comparing(String::length)).collect(toList());

              【讨论】:

                【解决方案8】:

                如果你使用的是 java 8,你也可以尝试使用这个 lambda

                packages.sort(Comparator.comparingInt(String::length));
                

                【讨论】:

                  【解决方案9】:

                  使用自定义比较器是正确的。这是实现它的一种方法:

                      Comparator c = new Comparator<String>()
                      {
                          public int compare(String s1, String s2) {
                              return Integer.compare(s1.length(), s2.length());
                          }
                      };
                      Collections.sort(results, c);
                      return results;
                  

                  【讨论】:

                    【解决方案10】:

                    如果您使用的是 Java 8+,则可以使用 lambda 表达式来实现(@Barend 的回答为)比较器

                    List<String> strings = Arrays.asList(new String[] {"cucumber","aeronomical","bacon","tea","telescopic","fantasmagorical"});
                    strings.sort((s1, s2) -> Math.abs(s1.length() - "intelligent".length()) - Math.abs(s2.length() - "intelligent".length()));
                    

                    【讨论】:

                    • Java 8+ 的最佳解决方案。简短而准确。
                    • 如果您只想按长度排序:strings.sort((s1, s2) -&gt; s1.length() - s2.length());
                    【解决方案11】:

                    您可以使用带有显式ComparatorCollections.sort() 版本来执行此操作。

                    【讨论】:

                      【解决方案12】:

                      使用自定义比较器:

                      public class MyComparator implements java.util.Comparator<String> {
                      
                          private int referenceLength;
                      
                          public MyComparator(String reference) {
                              super();
                              this.referenceLength = reference.length();
                          }
                      
                          public int compare(String s1, String s2) {
                              int dist1 = Math.abs(s1.length() - referenceLength);
                              int dist2 = Math.abs(s2.length() - referenceLength);
                      
                              return dist1 - dist2;
                          }
                      }
                      

                      然后使用java.util.Collections.sort(List, Comparator)对列表进行排序。

                      【讨论】:

                      • 正差异的优先级可以通过将正差异乘以 2,将负差异乘以负 2,然后加一来给出。
                      • 您应该将 referenceLength 设为最终值。
                      猜你喜欢
                      • 2015-10-16
                      • 2012-12-24
                      • 2010-10-18
                      • 1970-01-01
                      • 2014-11-27
                      • 1970-01-01
                      • 2014-02-09
                      • 2016-04-23
                      • 2017-07-19
                      相关资源
                      最近更新 更多