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