我试图在Java中使用PriorityQueue.
我有一些自定义对象,我以这种方式将它们添加到队列中:
Pet pet1 = new Pet();
Pet pet2 = new Pet();
Pet pet3 = new Pet();
PriorityQueue<Pet> queue = new PriorityQueue<Pet>();
queue.offer(pet1);
queue.offer(pet2);
queue.offer(pet3);
Run Code Online (Sandbox Code Playgroud)
此时,我意识到我的Pet对象必须实现Comparable才能从PriorityQueue获取ClassCastException.所以我让我的Pet实现Comparable,然后只返回0覆盖copmareTo(obj)方法.
但奇怪的是这里.当我...
queue.poll(); //return: pet1 queue: pet3, pet2
queue.poll(); //return: pet3 queue: pet2
Run Code Online (Sandbox Code Playgroud)
因为我按照pet1,pet2和pet3的顺序添加了它们,为什么在我第一次调用poll()时,它会对我的宠物序列进行排序?然后整个事情变得不再是一个队列,因为它的输入序列没有被保留,不是吗?
我怀疑它可能与Comparable接口和compareTo(obj)方法有关.但我所需要的只是保持其输入序列,所以我真的不需要比较任何东西或任何东西.
如何在队列中维护其输入序列?
谢谢!
我有一个list实现的对象Comparable.
我想对这个列表进行排序,这就是我使用它的原因Comparable.
每个对象都有一个字段,weight由3个其他成员int变量组成.
具有最多的对象的compareTo返回.
最重的不仅仅是如果 1weight
weightObj1.member1 > weightObj2.member1
weightObj1.member2 > weightObj2.member2
weightObj1.member3 > weightObj2.member3
Run Code Online (Sandbox Code Playgroud)
但实际上有点复杂,我最终得到的代码有太多的条件ifs.
如果weightObj1.member1 > weightObj2.member1持有,那么我在乎weightObj1.member2 > weightObj2.member2.
反之亦然.
否则,如果weightObj1.member2 > weightObj2.member2持有,那么我关心weightObj1.member3 > weightObj2.member3,反之亦然.
最后,如果weightObj1.member3 > weightObj2.member3持有AND,如果满足特定条件,则weightObj1获胜,反之亦然
我想知道有这样的设计方法吗?
我有以下界面:
interface MySortedCollection<T extends Comparable<T>> {
boolean isElement(T t);
void insert(T t);
void printSorted();
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用AVLTree来实现接口:
public class AVLTree<T> implements MySortedCollection{
private AVLNode<T> tree=null;
public AVLTree (){
}
public boolean isElement(T t){
}
public void insert(T t){
if(tree==null){
tree= new AVLNode<T>(t);
}
}
public void printSorted(){}
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误:
error: AVLTree is not abstract and does not override abstract
method insert(Comparable) in MySortedCollection
public class AVLTree<T> implements MySortedCollection{
Run Code Online (Sandbox Code Playgroud)
怎么了?
我得到一个错误符合theTree.insert(new File("a", 1));:The method insert(Comparable) in the type Tree is not applicable for the arguments (File).
当我尝试施放时,theTree.insert((Comparable) new File("a", 1));我得到了其他错误:E xception in thread "main" java.lang.ClassCastException: File cannot be cast to java.lang.Comparable at TreeApp.main(tree.java:134).
为什么我不能传递这个对象?
我的目标:
class FileObject
{
public String name;
public int size;
File(String a, int b)
{
this.name = a;
this.size = b;
}
}
Run Code Online (Sandbox Code Playgroud) 这是我写的比较器,用于根据成本对节点进行排序.
public class MyCostComparator implements Comparator<Node>{
public int compare(Node a, Node b){
if(a.pathCost > b.pathCost)
return 1;
else
return -1;
}
}
Run Code Online (Sandbox Code Playgroud)
我发现它的行为在我的机器(Java 1.7)和Uni的服务器(Java 1.5)上是不同的.但是,当我做到它:
if(a.pathCost >= b.pathCost) ,它似乎在1.5上工作正常,但1.7的另一种方式.
另外,当值相等时,NOT返回零的缺点是什么?
是否可以创建一个密钥是Collection(任何类型的集合)的映射?
如果我在大多数常见的收藏品上尝试它,我被告知收藏品不能用于比较.
我一直在尝试为自定义集合编写compareTo函数,但我很挣扎.
要么我需要编写compareTo,要么我需要找到一个接受地图接受的集合/集合的预制地图.
如何在地图上将集合用作关键字?我已经查看了Stack溢出,我已经多次搜索过这个问题,但我从来没有找到一个可靠的解决方案!
我想这样做的原因是我在Java中编写了一个模拟卡改组的'shuffle'模拟.我希望能够计算特定手(建模为集合)出现的次数.它看起来像这样:
H4,C3,D2: 8
H9,D6,S11: 10
......
Run Code Online (Sandbox Code Playgroud) 我正在实现一个BinaryNode<T>包含信息的二进制搜索树.在我的树类中,我有这行代码:
public class BST<T> implements BSTInterface<T extends Comparable<? super T>>
Run Code Online (Sandbox Code Playgroud)
这会导致许多错误,例如:
BST.java:10: error: > expected
public class BST<T> implements BSTInterface<T extends Comparable<? super T>>
^
BST.java:10: error: <identifier> expected
public class BST<T> implements BSTInterface<T extends Comparable<? super T>>
^
Run Code Online (Sandbox Code Playgroud)
我不确定为什么这不起作用,因为这行代码适用于我的界面.任何帮助将非常感激!我可能犯了一些愚蠢的错误.
所以,我只是试图测试如何compareTo在我自己的类型上使用该方法,并且即使是最简单的情况也无法使它工作.我的代码(自解释)在下面(它在用户定义的类型下创建一个15 - > 1的'数字'数组TestType.我希望它自然地排序.
public class TestType implements Comparable<TestType> {
public int n;
TestType(int _n) {
n = _n;
}
@Override
public int compareTo(TestType otherType) {
return this.n < otherType.n ? -1 : (this.n > otherType.n ? 1 : 0);
}
public static void main(String[] args){
TestType[] a = new TestType[15];
for(int i = 0; i < 15; i++){
a[i] = new TestType(15 - i);
System.out.println(a[i].n);
}
a.sort();
}
}
Run Code Online (Sandbox Code Playgroud)
如果你能看出它为什么不起作用,请告诉我:).
我正在尝试做一个非常简单的类,以便返回集合的最小值.这是我的代码:
public class Min_Comparable <T extends Comparable<? super T>> {
public T min(Collection<? extends T> c){
Iterator<? extends T> it = c.iterator();
T min = it.next();
while(it.hasNext()){
if(min.compareTo(it.next()) > 0 ){
min = it.next();
}
}
return min;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要内容:
public class Main {
public static void main(String[] args) {
Min_Comparable test = new Min_Comparable();
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(6);
list.add(0);
list.add(5);
list.add(2);
System.out.println(test.min(list));
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的错误:
Exception in thread "main" java.util.NoSuchElementException
at java.util.ArrayList$Itr.next(ArrayList.java:854)
at MidTerm.Min_Comparable.min(Min_Comparable.java:16)
at MidTerm.Main.main(Main.java:20) …Run Code Online (Sandbox Code Playgroud) 覆盖Comparable Interface的compareTo()方法的最佳方法是什么?另外,为什么我们在没有实现的情况下编写自己的compareTo()方法时需要实现Comparable Interface.以下面的Seat类为例:
public class Seat {
private final String seatNumber;
private double price;
public Seat(String seatNumber, double price) {
this.seatNumber = seatNumber;
this.price = price;
}
public int compareTo(Seat seat) {
return this.seatNumber.compareToIgnoreCase(seat.getSeatNumber());
}
}
Run Code Online (Sandbox Code Playgroud)
上面的工作虽然我们没有实现Comparable Interface,但为什么要实现它呢?
comparable ×10
java ×10
comparator ×2
generics ×2
collections ×1
compare ×1
compareto ×1
if-statement ×1
interface ×1
map ×1
object ×1
oop ×1
overriding ×1
queue ×1
sorting ×1