我有一个名为技巧卡片的数组,用于存储套装和等级。 有没有办法使用Collections.max来找到排名最高的卡?我在代码的其他方面使用了序数,但现在似乎无法使它工作。
我试过这个,(t是传递给方法的参数。技巧是包含卡片的数组)
Collections.max(t.trick.rank.ordinal());
它是else if语句的一部分,然后转到另一个,所以我不认为我可以用for循环启动它,并且作为继承类的一部分我不能做for循环其他地方,因为它抛出由于它没有从其他类继承而导致的错误。 有没有一种简单的方法来找到我排名最高的卡?
答案 0 :(得分:2)
我建议你让你的Card类实现Comparable
接口。
这要求您在Card实例之间定义比较函数。
然后你需要做的就是获得最大的"卡上就是Collections.max
。
完整但极简主义的解决方案如下所示:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestingClass
{
public static void main(String[] args) throws Exception
{
List <Card> a = new ArrayList<Card>();
a.add(new Card(1));
a.add(new Card(5));
a.add(new Card(2));
a.add(new Card(3));
Card x= Collections.max(a);
System.out.println(x.rank); //this will print 5
}
}
class Card implements Comparable<Card>
{
public int rank;
public Card(int rank)
{
this.rank=rank;
}
@Override
public int compareTo(Card other) {
if(this.rank<other.rank) return -1;
else if(other.rank< this.rank) return 1;
return 0;
}
}
答案 1 :(得分:2)
Collections.max()
的一个重载将比较器作为第二个参数。使用它可以实现自己的比较器类,如下所示:
class ValueComparator implements Comparator<Card> {
@Override
public int compare(Card a, Card b)
{
return a.rank > b.rank ? 1 : a.rank == b.rank ? 0 : -1;
}
}
然后你可以用:
调用maxCard maximum = Collections.max(trick, new ValueComparator());
这样做的价值在于您可以创建多个比较器并使用它们来执行各种比较类型的基于比较的操作(最大值,排序等等)。例如,如果你想比较卡片的套装,你可以实现套装比较器。 This Question及其答案提供了一些非常有用的示例,说明如何使用比较器。
答案 2 :(得分:1)
它取决于int
对Java数组编制索引的数据类型。 Java中的最大正int
为2^31 – 1 = 2,147,483,647
。特定于平台的限制可以非常接近这个数字 - 例如Java 1.7上的64位MB Pro我可以愉快地初始化最多2,147,483,645
或整数的数组。 MAX_VALUE-2
元素。
我认为这不是一个好习惯。但这是一个很好的信息!