繁体   English   中英

使用比较器对字符串长度进行排序

[英]sorting string lengths using comparator

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

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

我将不胜感激任何解决问题的线索。

您需要为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.sort List对象进行排序。 由于您正在对数组进行排序,因此您应该使用Arrays.sort

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

如果数据源是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();
    }
});

一个班轮

上升

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

降序

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

应该

class comp implements Comparator<String> { ...

甚至更好

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

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

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

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));
    }
}

通过使用流和比较器实现相同,如下所示 -

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM