如何在Java中使用Comparator接口?

如何在Java中使用Comparator接口?,java,arraylist,comparator,Java,Arraylist,Comparator,我不知道如何正确使用比较器接口 注意:我不想使用我在大多数代码中看到的“一行”比较器实现,这意味着: Collections.sort(deck, new Comparator<Card>() { @Override public int compare(Card o1, Card o2) { return WHATEVER; }); Collections.sort(deck,newcomparator(){ @凌驾 公共整数比较(卡o1、卡o2){ 回报一切;

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

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

Collections.sort(deck, new Comparator<Card>() {
  @Override
  public int compare(Card o1, Card o2) {
   return WHATEVER;
  });
Collections.sort(deck,newcomparator(){
@凌驾
公共整数比较(卡o1、卡o2){
回报一切;
});
同样,我不想使用这个,因为我将要对许多不同的ArrayList进行排序,每次这样做似乎都是浪费空间。我想让compareTo方法在一个地方编写一次,以某种方式使其工作

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

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

import java.util.*;
公共类卡实现比较器
{
私有字符串编号;
私有int值;
私人金融价值;
私服;
私人玩家所有者;
公共卡(字符串编号、字符串套装)
{
这个。数字=数字;
开关(编号){
案例“2”:this.value=2;
打破
案例“3”:此.value=3;
打破
案例“4”:此.value=4;
打破
案例“5”:此.value=5;
打破
案例“6”:此.value=6;
打破
案例“7”:此.value=7;
打破
案例“8”:此.value=8;
打破
案例“9”:此.value=9;
打破
案例“10”:此.value=10;
打破
案例“J”:该值=11;
打破
案例“Q”:该值=12;
打破
案例“K”:该值=13;
打破
案例“A”:该值=14;
打破
}
这套衣服;
开关(套装){
案例“黑桃”:this.finalValue=this.value*4;
打破
案例“Hearts”:this.finalValue=this.value*5;
打破
案例“俱乐部”:this.finalValue=this.value*2;
打破
案例“钻石”:this.finalValue=this.value*3;
打破
}
}
公共整数比较(卡卡1、卡2)
{
整数值1;
if(card1.getSuit()=“Hearts”)
suitValue1=5;
else if(card1.getSuit()=“黑桃”)
suitValue1=4;
else if(card1.getSuit()=“钻石”)
suitValue1=3;
其他的
suitValue1=2;
整数值2;
if(card2.getSuit()=“Hearts”)
拟合值2=5;
else if(card2.getSuit()=“黑桃”)
拟合值2=4;
else if(card2.getSuit()=“钻石”)
拟合值2=3;
其他的
suitValue2=2;
整数值1,数值2;
value1=card1.getValue();
value2=card2.getValue();
如果(SuiteValue1!=SuiteValue2)
返回SuiteValue1.compareTo(SuiteValue2);
其他的
返回值1.比较(值2);
}
//获取方法
public int getValue()
{返回此.value;}
public int getFinalValue()
{返回this.finalValue;}
公共字符串getNumber()
{返回此.number;}
公共字符串getSuit()
{返回此.suit;}
公共播放器getOwner()
{返回此.owner;}
//设置方法
公共无效设置值(int值)
{this.value=value;}
public void setFinalValue(int finalValue)
{this.finalValue=finalValue;}
公共无效集合号(字符串号)
{this.number=number;}
公共诉讼(线状诉讼)
{this.suit=suit;}
公共无效设置所有者(玩家)
{this.owner=player;}
}
这就是我的比较方法。我应该把它放在另一个类或其他什么东西中吗?我尝试使用以下方法调用它:

Collections.sort(deck, new Comparator<Card>());
Collections.sort(deck,newcomparator());
但这显然是错误的


deck是一个ArrayList:
private ArrayList deck=new ArrayList();
填充了各种卡片对象。

因为您似乎只有一种方法可以比较卡片对象,所以您实际上不必使用比较器。让卡片实现Comparable,然后使用单参数方法进行排序:

Collections.sort(deck);

由于您似乎只有一种方法可以比较卡对象,因此您实际上不必使用比较器。相反,让卡实现Comparable,然后按单参数方法排序:

Collections.sort(deck);

你想实现Comparable,然后就可以对数组进行排序。

你想实现Comparable,然后就可以对数组进行排序。

你把
Comparable
Comparator
搞混了。它们当然是相似的,但本质上是不同的

Comparable
定义了类的自然顺序——默认情况下类的实例应该如何排序。这实际上就是您想要的

Comparator
帮助您在使用与自然顺序不同的排序顺序时对类的实例进行排序。这似乎不是您的目标

所以你真正想要的是:

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
}
这些卡片将知道如何分类


如果您需要更多指导,我们实际上使用上提供的文件在
Comparable
Comparator
上进行了一次测试。如果您愿意,请查看。

您将
Comparable
Comparator
混淆了。它们当然是相似的,但本质上是不同的

Comparable
定义了类的自然顺序——默认情况下类的实例应该如何排序。这实际上就是您想要的

Comparator
帮助您这样做
Collections.sort(deck)
public class Card implements Comparable<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;
        this.value = 0;
        this.finalValue = 0;


        //card value
        if ("2".equalsIgnoreCase(number))
        {
            this.value = 2;
        }
        else if ("3".equalsIgnoreCase(number))
        {
            this.value = 3;

        }
        else if ("4".equalsIgnoreCase(number))
        {
            this.value = 4;

        }
        else if ("5".equalsIgnoreCase(number))
        {
            this.value = 5;

        }
        else if ("6".equalsIgnoreCase(number))
        {
            this.value = 6;

        }
        else if ("7".equalsIgnoreCase(number))
        {
            this.value = 7;

        }
        else if ("8".equalsIgnoreCase(number))
        {
            this.value = 8;

        }
        else if ("9".equalsIgnoreCase(number))
        {
            this.value = 9;
        }
        else if ("10".equalsIgnoreCase(number))
        {
            this.value = 10;
        }
        else if ("J".equalsIgnoreCase(number))
        {
            this.value = 11;

        }
        else if ("Q".equalsIgnoreCase(number))
        {
            this.value = 12;
        }
        else if ("K".equalsIgnoreCase(number))
        {
            this.value = 13;

        }
        else if ("A".equalsIgnoreCase(number))
        {
            this.value = 14;
        }


        //suits
        if ("Spades".equalsIgnoreCase(number))
        {
            this.finalValue = this.value * 4;
        }
        else if ("Hearts".equalsIgnoreCase(number))
        {
            this.finalValue = this.value * 5;

        }
        else if ("Clubs".equalsIgnoreCase(number))
        {
            this.finalValue = this.value * 2;

        }
        else if ("Diamonds".equalsIgnoreCase(number))
        {
            this.finalValue = this.value * 3;

        }

    }


    @Override
    public int compareTo(Card o)
    {
        final int EQUAL = 0;
        final int LESS_THAN = -1;
        final int GREATER_THAN = 1;

        if (this == o || this.getFinalValue() == o.getFinalValue())
        {
            return EQUAL;
        }
        else if (this.getFinalValue() < o.getFinalValue())
        {
            return LESS_THAN;
        }
        else
        {
            return GREATER_THAN;
        }
    }

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