【问题标题】:Collections.sort() using comparator? [closed]Collections.sort() 使用比较器? [关闭]
【发布时间】:2013-10-30 12:54:49
【问题描述】:
import java.util.*;

public class C_2 {
    public static void main(String args[]) {
        String theStrings[] = { "x", "a", "b", "c", "d" };
        List l = Arrays.asList(theStrings);
        Collections.sort(l);                            // line a
        Collections.sort(l, new ThisIsMyThing());       // line b
        System.out.println(l);
    }
}

class ThisIsMyThing implements Comparator {
    public int compare(Object o1, Object o2) {
        String s1 = (String)o1;
        String s2 = (String)o2;

        return -1 * s1.compareTo(s2);
    }
}

我了解C_2 类基于两种不同的技术进行排序。 一种是标准Collections.sort(l); 另一个是Collections.sort(l,Comparator<>());我无法理解这种排序方法。谁能给我解释一下?

【问题讨论】:

  • 你不明白什么?你读过文档吗?
  • Collections.sort(l) // line a 这会根据自然顺序对列表进行排序,对吧? Collections.sort(l, new ThisIsMyThing()); // line b 实现了一个 Comparator,其中的参数是 object 类型的。然后类型转换为字符串。在字符串之间进行比较?
  • 是的。请注意,您应该使用泛型。

标签: java collections comparator


【解决方案1】:

Collection.sort(l) 假定l 的内容是ComparableCollection.sort(1, Comparator) 使用自定义比较器来比较 l 的内容,这就是你所做的。排序的想法(包括sort() 方法)意味着对象必须具有可比性——在这种情况下,可以使用ComparableComparator

请注意,许多 Java 对象已经具有可比性,包括 StringDateNumber。对于那些,你可以使用Collection.sort(someList);

示例

假设你有一个Circle

public class Circle {
    double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getArea(){
        return radius * radius * Math.PI;
    }
}

如果您创建了 100 个Circle 对象:

ArrayList<Circle> circleList = new ArrayList<>();

for (int i = 0; i < 100; i++) {
    // adds a circle with random radius
    circleList.add(new Circle((int)(Math.random() * 100)));
}

// try to sort the list
Collections.sort(circleList);   //compilation error: must be Comparable

您无法对它们进行排序,因为 Java 不知道如何比较它们。你必须告诉 Java:

public class Circle implements Comparable<Circle> {
    double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    // you MUST override the compareTo method from the Comparable interface
    @Override
    public int compareTo(Circle cirlce){
        if (this.getArea() > circle.getArea())
            return 1;
        else if (this.getArea() == circle.getArea())
            return 0;
        else 
            return -1;
    }

    public double getArea(){
        return radius * radius * Math.PI;
    }
}

借助 Circle 类中的 compareTo() 方法,Java 现在知道如何比较它们并可以对它们进行排序。

现在你可以这样做了:

Collections.sort(circleList);
// Yayyy I'm being sorted by the size of my areas!!!!!

【讨论】:

  • 感谢您的解释。 Collections.sort() 只能在列表中使用?
  • @peeskillet:……什么? Collections.sort 只接受 List 参数。
  • @peeskillet:但即使是你的修订版也不是trueCollections.sortCollections 类的静态方法,只接受 List 参数。 任何类都可以调用Collections.sort,不管它是否实现Collection,但无论是谁调用它,都只能传递一个List参数给它。
【解决方案2】:

Collections.sort 采用比较器根据您提供的比较器对列表进行排序,其他遵循自然排序顺序。也就是说,如果您想遵循任何自定义排序顺序,请使用此方法。没什么好解释的。

Use this link for explaination.

【讨论】:

    【解决方案3】:

    使用 Collections.sort(Collection) 对集合进行排序以对您的值进行排序。此方法适用于实现Comparable 接口的人。此接口定义了方法compare,它执行元素的成对比较,如果元素小于比较元素,则返回-1,如果相等则返回0,如果大于则返回1。一个常见的例子是 Integer 类。

    如果要进行不同的排序,您可以根据Comparatorinterface 定义自己的实现。这种方法是您然后按任何属性甚至属性组合对任何对象进行排序。例如,如果您有 Person 类型的对象,其属性为 income 和 dateOfBirth,您可以定义 Comparator 的不同实现并根据您的需要对对象进行排序。

    【讨论】:

      猜你喜欢
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多