我想使用 Collections.sort 对"HighlightedCellRecords"的通用堆栈进行排序,但收到运行时错误



我以前没有用过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因此它不起作用。虽然StackList都源于AbstractList但它们仍然不能互换。

通常,当您处理Collections并最终需要铸造您的收藏时,您可能应该停下来问问自己为什么。虽然你可能能够让它编译,但让它 1( 运行和 2( 做你期望的事情将是一个很长的机会。

你当然可以为Stack编写自己的排序逻辑,但我会质疑你为什么要这样做。Stack合约旨在保留其元素的插入顺序。当你需要扔掉它时,你最好重新考虑你的一些设计选择。

相关内容

  • 没有找到相关文章

最新更新