Java 我想对一个通用堆栈“排序”;HighlightedCellRecords“;使用Collections.sort但获取运行时错误
我以前没有使用过集合。排序。也许我不能用它来排序我的通用对象堆栈。我发现了一个很有希望的示例,并对其进行了编译,但我得到了一个运行时错误,如下代码所示Java 我想对一个通用堆栈“排序”;HighlightedCellRecords“;使用Collections.sort但获取运行时错误,java,sorting,generics,linked-list,stack,Java,Sorting,Generics,Linked List,Stack,我以前没有使用过集合。排序。也许我不能用它来排序我的通用对象堆栈。我发现了一个很有希望的示例,并对其进行了编译,但我得到了一个运行时错误,如下代码所示 package gbl; import java.awt.Color; import java.util.Collections; import java.util.List; public class HighightedCellRecord implements Comparable<HighightedCellRecord>{
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));
}
}
然而,我想出了一个解决办法,我不知道这是否是唯一的办法。下面是修改后的main
(从上面显示的错误点下方开始):
如果我需要对它进行排序,那么它不应该是一个堆栈吗?
是否有一种方法可以直接对堆栈排序?如果没有,我将看看将其更改为简单链表需要付出多少努力。(我在程序中使用了另外三个堆栈:一个用于撤消,一个用于重做,另一个用于事务。我想我被冲昏头脑了。)您的
GenericStack
不是列表;它包含一个列表
大概您通过在链接列表的前面添加来实现推送(…)
方法;只需采用相同的排序方法:
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);
}
}
public类GenericStack{
//你真的应该把这件事保密;
//您想隐藏您的实现
public LinkedList stack=new LinkedList();
// ...
公共无效排序(){
集合。排序(堆栈);
}
}
然后调用Collections.sort((List)s)代码>只需调用s.sort()
您的另一个选择是使GenericStack
实现List
。或者,直接使用链接列表
,因为它实现了。如果您查看集合的javadoc。排序
它需要一个列表
作为参数。由于堆栈
不是列表
它将不起作用。虽然Stack
和List
都源自AbstractList
,但它们仍然不能互换
通常,当你处理收藏时,如果你最终需要转换你的收藏,你应该停下来问问自己为什么。虽然您可能能够让它编译,但让它1)运行,2)按照您的期望去做将是一个漫长的过程
您当然可以为堆栈
编写自己的排序逻辑,但我想问您为什么要这样做。堆栈
契约旨在保留其元素的插入顺序。当你需要扔掉它时,你最好重新考虑一下你的一些设计选择。@Baldy——谢谢。你澄清了我所有的误解,并巩固了我的猜测,即我应该首先将HighlightedStack列为一个列表。你是对的:我真的应该开始研究Javadocs。我也认罪,当我知道更多的时候,我绝对没有理由公开这些东西。@James_D--谢谢你提到GenericStack不是,而是包含一个列表。我会看看是否可以利用你的建议而不是伪造或重新设计。使用链接列表有什么错?为什么要重新发明轮子?@James--我打算修改程序,使需求排序对象成为LinkedList而不是堆栈。谢谢
t = new LinkedList<>();
while(s.isNotEmpty())
t.add(s.pop());
Collections.sort(t);
while(! t.isEmpty())
s.push(t.pop());
public class GenericStack<E> {
public LinkedList <E> stack = new LinkedList<>();
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);
}
}