【问题标题】:sorting string lengths using comparator使用比较器对字符串长度进行排序
【发布时间】:2021-04-01 02:12:38
【问题描述】:

在尝试根据元素字符串长度对数组进行排序时,我遇到了编译错误。我有一套开始,,,

Set<String> arraycat = new HashSet<String>();
//add contents to arraycat
String[] array = arraycat.toArray(new String[0]);
//array looks like this now:
//array=[cat,cataaaa,cataa,cata,cataaa]

理想情况下,我希望排序为

array=[cat,cata,cataa,cataaa,cataaaa]

所以我有一个类型的比较器

class comp implements Comparator {

    public int compare(String o1, String o2) {
        if (o1.length() > o2.length()) {
            return 1;
        } else if (o1.length() < o2.length()) {
            return -1;
        } else {
            return 0;
        }
    }
}

然后我打电话给班级

Collections.sort(array, new comp());

但是,它给我带来了两个编译错误:

comp is not abstract and does not override abstract method   compare(java.lang.Object,java.lang.Object) in java.util.Comparator
class comp implements Comparator {
^
testa.java:59: cannot find symbol
symbol  : method sort(java.lang.String[],comp)
location: class java.util.Collections
Collections.sort(array, new comp());
^2 errors

如果能提供任何解决问题的线索,我将不胜感激。

【问题讨论】:

    标签: java


    【解决方案1】:

    您需要为Comparator 指定一个类型参数才能使您的实现工作。

    class comp implements Comparator<String> {
      public int compare(String o1, String o2) {
        if (o1.length() > o2.length()) {
          return 1;
        } else if (o1.length() < o2.length()) {
          return -1;
        } else {
          return 0;
        }
      }
    }
    

    在 Java 1.7 及更高版本中,您还可以将此方法的主体简化为:

    class comp implements Comparator<String> {
      public int compare(String o1, String o2) {
        return Integer.compare(o1.length(), o2.length());
      }
    }
    

    另外,Collections.sortList 对象进行排序。由于您正在对数组进行排序,因此您应该使用Arrays.sort:

    Arrays.sort(array, new comp());
    

    【讨论】:

    • 嗨劳伦斯..谢谢你..这已经解决了第一个编译错误:但是,我仍然得到另一个编译错误说:“找不到符号符号:方法排序(java.lang.String [ ],comp) 位置:类 java.util.Collections Collections.sort(array, new comp());"我已经导入了 util* 包,不知道为什么会出现这个错误
    • sort() 采用 List,而不是 String[] 数组。使用Arrays.asList()进行转换。
    • 另外,对于更简单的比较器,请考虑使用Integer.signum(int) 而不是if/else-if/else;例如return Integer.signum(o1.length() - o2.length());
    • 这个问题太老了,但无论如何......没有必要将数组转换为列表,您可以这样排序:Arrays.sort(array, new comp());
    • @RobHruska 如果JDK >= 1.7,甚至可以使用Integer.compare(o1.length(), o2.length())
    【解决方案2】:

    如果数据源是array,则需要使用Arrays.sort()方法。

    例如,

    String []array={"first","second","third","six"};
    
    Arrays.sort(array,new Comparator<String>()
    {
      public int compare(String s1,String s2)
       {
        return s1.length() - s2.length();
        }
    });
    

    或者将数组转换为List以使用Collections.sort()方法,

    Collections.sort(Arrays.asList(array),new Comparator<String>()
    {
      public int compare(String s1,String s2)
       {
        return s1.length() - s2.length();
        }
    });
    

    【讨论】:

      【解决方案3】:

      一个衬里

      升序

      Arrays.sort(words, Comparator.comparingInt(String::length));
      

      降序

      Arrays.sort(words, Comparator.comparingInt(String::length).reversed());
      

      【讨论】:

        【解决方案4】:

        应该是

        class comp implements Comparator<String> { ...
        

        甚至更好

        Collections.sort(array, new Comparator<String> { ...
        

        (甚至没有命名只使用过一次的类)

        【讨论】:

        • 你需要指定类型变量!比较器
        【解决方案5】:

        通过使用以下流和比较器实现相同-

        Arrays.stream(array)
              .sorted(Comparator.comparingInt(String::length))
              .forEach(a -> System.out.print(a + " "));
        

        【讨论】:

          【解决方案6】:

          我最近有一个类似的任务,我会给你提供一个额外的例子。

          import java.util.Arrays;
          import java.util.Comparator;
          //for more information: http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html
          
          /**
           *
           * @author Xilef
           */
          public class StringKorter implements Comparator<String> {
              @Override
              public int compare(String s1, String s2){
                  if (s1.length() > s2.length())
                   return 1;
                  else if (s1.length() < s2.length())
                   return -1;
                  else return 0;
              }
              public static void main(String[] args) {
                  String[] woorden = { "boot", "kinderen", "stoel", "volwassenen", "ei", "stoel", "kop", "zeshoek", "stoel", "ei" };
                  System.out.println("woorden: " + Arrays.toString(woorden));//before sorting by length
                  Arrays.sort(woorden, new StringKorter());
                  System.out.println("Array woorden after sorting by length: " + Arrays.toString(woorden));
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-06-21
            • 2014-05-30
            • 2018-07-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多