我以前没有用过Collections.sort
。也许我不能用它来对我的通用对象堆栈进行排序。我在这里找到了一个很有前途的例子,它进行了编译,但我得到了一个运行时错误,显示在代码下方。
package gbl;
import java.awt.Color;
import java.util.Collections;
import java.util.List;
public class HighightedCellRecord implements Comparable<HighightedCellRecord>{
char content;
int row,
col;
Color foreground,
background;
boolean isVertex;
public HighightedCellRecord() { }
public HighightedCellRecord(char ch, int r, int c, Color f, Color b){//,
content = ch;
row = r;
col = c;
foreground = f;
background = b;
isVertex = false;
}
@Override
public int compareTo(HighightedCellRecord o)
{
if(this.row == o.row)
{
if (this.col > o.col) return 1;
else if (this.col == o.col) return 0;
else return -1;
}
else
{
if (this.row > o.row) return 1;
else if (this.row == o.row) return 0;
else return -1;
}
}
public String toString(){
return "<" + content + "> @ (" + row + "," + col + ")";
}
public String toWrite(){
return content + "," + row + "," + col;
}
public static void main(String[] args) {
GenericStack<HighightedCellRecord> s ;
s = new GenericStack<>();
s.push(new HighightedCellRecord('O', 3, 7, null, null));
s.push(new HighightedCellRecord('D', 3, 9, null, null));
s.push(new HighightedCellRecord('W', 3, 6, null, null));
s.push(new HighightedCellRecord('R', 3, 8, null, null));
/////////////////// error on next line /////////////////////////////
Collections.sort((List<HighightedCellRecord>) s);
for(int i = 0; i < s.size(); i++)
System.out.println(s.find(i));
}
}
。
Exception in thread "main" java.lang.ClassCastException:
gbl.GenericStack cannot be cast to java.util.List
at gbl.HighightedCellRecord.main(HighightedCellRecord.java:58)
Java Result: 1
但是,我想出了一个解决方法,我不知道这是否是唯一的方法。以下是修改后的main
(从上面显示的错误点下方(:
t = new LinkedList<>();
while(s.isNotEmpty())
t.add(s.pop());
Collections.sort(t);
while(! t.isEmpty())
s.push(t.pop());
我意识到,根据定义和概念,堆栈不同于链表不同于队列,但我不太明白为什么我不能在堆栈上使用Collections.sort
,这只是一种特殊类型的链表,不是吗,如我的通用堆栈定义的前几行所示:
public class GenericStack<E> {
public LinkedList <E> stack = new LinkedList<>();
底线是,如果我需要对其进行排序,它不应该是一个堆栈?
有没有办法直接对我的堆栈进行排序?如果没有,我会看看需要付出多少努力才能将其更改为简单的链表。(我在程序中使用其他三个堆栈:一个用于撤消,一个用于重做,另一个用于事务。我想我得意忘形了。
你的GenericStack
不是List
,它包含一个List
。
大概你通过添加到LinkedList
前面来实现push(...)
方法;只需采用相同的排序方法:
public class GenericStack<E> {
// you should really make this private;
//you want to hide your implementation
public LinkedList<E> stack = new LinkedList<>();
// ...
public void sort() {
Collections.sort(stack);
}
}
然后不要打电话给Collections.sort((List<...>)s);
而只是打电话s.sort()
您的另一种选择是GenericStack
实施List
。或者,直接使用LinkedList
,因为它实现了DeQue
。
如果你查看javadoc Collections.sort
它需要一个List<>
作为参数。由于Stack
不是List
因此它不起作用。虽然Stack
和List
都源于AbstractList
但它们仍然不能互换。
通常,当您处理Collections
并最终需要铸造您的收藏时,您可能应该停下来问问自己为什么。虽然你可能能够让它编译,但让它 1( 运行和 2( 做你期望的事情将是一个很长的机会。
你当然可以为Stack
编写自己的排序逻辑,但我会质疑你为什么要这样做。Stack
合约旨在保留其元素的插入顺序。当你需要扔掉它时,你最好重新考虑你的一些设计选择。