当前位置: 首页 > 知识库问答 >
问题:

如何在Java中使用Comparator接口?

欧阳俊晖
2023-03-14

我不知道如何正确使用比较器接口。

注意:我不想使用我在大多数代码中看到的“一行”比较器实现,这意味着:

Collections.sort(deck, new Comparator<Card>() {
  @Override
  public int compare(Card o1, Card o2) {
   return WHATEVER;
  });

再说一遍,我不想使用这个,因为我将对许多不同的ArrayList进行排序,每次这样做似乎都是浪费空间。我想以某种方式让它工作,让我的compareTo方法在一个地方编写一次。

我尝试了许多不同的方法,但我对实现接口还不熟悉,所以我可能遗漏了一些东西。

这是我的Card类和它的比较方法。(注意:让我为您节省一些时间,并说我对使用枚举来简化代码和比较不感兴趣,我只想学习如何正确使用比较器。我知道这看起来很糟糕,但我必须使用一些已经写好的代码。)

import java.util.*;
public class Card implements Comparator<Card>
{
    private String number;
    private int value;
    private int finalValue;
    private String suit;
    private Player owner;

    public Card(String number, String suit)
    {
        this.number=number;
        switch (number){
            case "2": this.value = 2;
                break;
            case "3": this.value = 3;
                break;
            case "4": this.value = 4;
                break;
            case "5": this.value = 5;
                break;    
            case "6": this.value = 6;
                break;
            case "7": this.value = 7;
                break;
            case "8": this.value = 8;
                break;    
            case "9": this.value = 9;
                break;
            case "10": this.value = 10;
                break;
            case "J": this.value = 11;
                break;
            case "Q": this.value = 12;
                break;
            case "K": this.value = 13;
                break;
            case "A": this.value = 14;
                break;
            }

        this.suit=suit;
        switch (suit){
            case "Spades": this.finalValue = this.value*4;
                break;
            case "Hearts": this.finalValue = this.value*5;
                break;
            case "Clubs": this.finalValue = this.value*2;
                break;
            case "Diamonds": this.finalValue = this.value*3;
                break;
            }
    }

    public int compare(Card card1, Card card2)
    {
        Integer suitValue1;
        if (card1.getSuit() == "Hearts")
        suitValue1=5;
        else if (card1.getSuit() == "Spades")
        suitValue1=4;
        else if (card1.getSuit() == "Diamonds")
        suitValue1=3;
        else
        suitValue1=2;

        Integer suitValue2;
        if (card2.getSuit() == "Hearts")
        suitValue2=5;
        else if (card2.getSuit() == "Spades")
        suitValue2=4;
        else if (card2.getSuit() == "Diamonds")
        suitValue2=3;
        else
        suitValue2=2;

        Integer value1, value2;
        value1 = card1.getValue();
        value2 = card2.getValue();

        if (suitValue1 != suitValue2)
        return suitValue1.compareTo(suitValue2);
        else
        return value1.compareTo(value2);

    }

    //get methods
    public int getValue()
    {return this.value;}

    public int getFinalValue()
    {return this.finalValue;}

    public String getNumber()
    {return this.number;}

    public String getSuit()
    {return this.suit;}

    public Player getOwner()
    {return this.owner;}

    //set methods
    public void setValue(int value)
    {this.value = value;}

    public void setFinalValue(int finalValue)
    {this.finalValue = finalValue;}

    public void setNumber(String number)
    {this.number = number;}

    public void setSuit(String suit)
    {this.suit = suit;}

    public void setOwner(Player player)
    {this.owner = player;}

}

这就是我的比较方法。我应该把它放在另一门课上还是别的什么?我试着用这个来称呼它:

Collections.sort(deck, new Comparator<Card>());

但这显然是错误的。

甲板是一个ArrayList:私有ArrayList


共有3个答案

鲁景山
2023-03-14

总结如下:

  • 要对数组进行排序,请使用集合。分拣(甲板)
晋言
2023-03-14

因为你似乎只有一种方法来比较卡对象,所以你真的不必使用比较器。让Card实现可比,然后用1-参数方法排序:

Collections.sort(deck);
魏煜祺
2023-03-14

您将ComparableComparator混淆。它们当然是相似的,但实际上是根本不同的。

Comparable定义类的自然顺序——默认情况下类的实例应该如何排序。这正是你想要的。

当您想要使用不同于自然顺序的排序顺序时,比较器可以帮助您对类的实例进行排序。这似乎不是你的目标。

所以你真正想要的是:

public class Card implements Comparable<Card> {
  public int compareTo(Card otherCard) {
    //return 1 when this instance is greater than the parameter, -1 if less; 0 if equal
  } 

  //Other stuff
  //And make sure compareTo is consistent with equals
}

请注意,必须实现的方法是compareTo,这与使用Comparator实现的方法不同。

然后,您只需按以下方式进行排序:

Collections.sort(deck)

卡片会知道如何排序。

如果您需要更多指导,我们实际上使用Github上提供的文件编写了一个关于ComparableComparator教程。如果你喜欢的话就去看看。

 类似资料:
  • TreeSet和TreeMap都按排序顺序存储元素。 但是,比较器精确定义了sorted order含义。 Comparator接口定义了两个方法:compare()和equals()。 这里显示的compare()方法比较了两个元素 - 比较方法 int compare(Object obj1, Object obj2) obj1和obj2是要比较的对象。 如果对象相等,则此方法返回零。 如果

  • 问题内容: 我学会了如何使用可比对象,但是在使用比较器时遇到了困难。我的代码有错误: 这是我的代码: 我相信它必须与比较方法中的转换有关,但我一直在玩,但仍然找不到解决方案 问题答案: 你的示例类有几件尴尬的事情: 它有个和时称为人(更多用于对象,而不是人); 当将一个类命名为某个事物的复数形式时,这表明它是对多个事物的抽象。 无论如何,这是如何使用的演示: 编辑 等效的Java 8演示如下所示:

  • 主要内容:1 什么是Java Comparator接口,2 Java Comparator接口的方法,3 Java Comparator接口的例子1 什么是Java Comparator接口 Java Comparator接口用于对用户定义的类的对象进行排序。 该接口在java.util包下,包含2个方法compare(Object obj1,Object obj2)和equals(Object element)。 它提供了多种排序顺序,意味着,您可以根据任何数据成员(例如,编号,名称,年龄或其

  • 我有一个Employee类,它有如下3个字段。 为此,我希望根据员工姓名(empName)排序,如果多个员工的姓名相同,则根据员工id(empId)排序。 为此,我编写了一个自定义比较器,使用java.util.比较器如下所示。 我已经创建了8个Employee对象并添加到ArrayList中,如下所示。 并使用上述比较器对列表进行如下排序。 它工作得非常好。但这可以使用类似的方法来完成,如下所示

  • 问题内容: 我有一个 保持地图根据浮动量排序的最佳方法是什么? 是最好的答案??如何使用? 我只创建一次地图,并替换了经常使用的和。 问题答案: 我会用,它实现。正是为此目的而设计的。 例: 有关SortedMap的信息,请参见Java教程页面。 和这里的教程列表相关TreeMap的。

  • 我在一些文章中对集合有了一些了解。 但是我搞不清楚哪里应该实现collections.sort()方法,哪里需要使用可比接口(compareTo()和比较器接口(compare())。 比较接口用于比较这个和另一个参考对象,而比较器用于比较两个对象。 我想知道具体哪种情况需要使用的方法?