[解決済み] java.lang.Comparable にキャストできません。
2022-02-02 10:08:06
質問
この質問はすでにされていますが、私は実装に特有の疑問があります。
私はバイナリーツリーのトップビューを印刷しようとしており、以下はそのための完全なコードです。
import java.util.*;
class Node{
int data;
Node right;
Node left;
Node(int data){
this.data = data;
}
}
class Pair<F,S>{
private F first;
private S second;
public Pair(F first, S second){
this.first = first;
this.second = second;
}
public F getFirst(){return first;}
public S getSecond(){return second;}
}
class BinaryTreeTopView{
public static void printTopView(Node root){
if(root == null)
return;
Queue <Pair<Node,Integer>> q = new Queue<>();
Map <Integer,Node> map = new HashMap<>();
Pair<Node,Integer> p = new Pair<>(root, 0);
q.add(p);
/*
I am storing nodes and the corresponding horizontal distances
in the form of a pair which then are being stored in the queue
to ensure level order traversal
*/
while(!q.isEmpty()){
Pair<Node,Integer> temp = q.peek();
q.remove();
if(map.containsKey(temp.getSecond())==true){
map.put(temp.getSecond(),temp.getFirst());
} else {
System.out.println(temp.getFirst().data);
map.put(temp.getSecond(),temp.getFirst());
}
if(temp.getFirst().left!=null){
Pair<Node,Integer> left = new Pair<>(temp.getFirst().left, temp.getSecond()-1);
q.add(left);
}
if(temp.getFirst().right!=null){
Pair<Node,Integer> right = new Pair<> (temp.getFirst().right, temp.getSecond()+1);
q.add(right);
}
}
}
public static void main(String[] args) {
Node root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.right = new Node(5);
root.left.left = new Node(4);
root.right.left = new Node(6);
root.right.right = new Node(7);
root.right.left.right = new Node(8);
root.right.right.left = new Node(10);
root.right.right.right = new Node(9);
root.right.right.left.right = new Node(11);
root.right.right.left.right.right = new Node(12);
printTopView(root);
}
}
コンパイルは正常に行われますが、実行時に例外が発生します。 現在、以下のような例外が発生し、何が問題なのかがわかりません。
Exception in thread "main" java.lang.ClassCastException:
Pair cannot be cast to java.lang.Comparable at java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:652)
at java.util.PriorityQueue.siftUp(PriorityQueue.java:647)
at java.util.PriorityQueue.offer(PriorityQueue.java:344)
at java.util.PriorityQueue.add(PriorityQueue.java:321)
解決方法は?
PairがComparableを実装していないためです。どちらか一方を実装してください。
public class Pair implements Comparable<Pair> {
public int compareTo(Pair o) {
// ...
}
}
または、優先キューでコンパレータを使用する
コンパレータを使用する。
PriorityQueue<DummyObject> pq = new
PriorityQueue<DummyObject>(5, new DummyObjectComparator());
コンパレータを定義します。
class DummyObjectComparator implements Comparator<DummyObject>{
// Overriding compare()method of Comparator
public int compare(DummyObject s1, DummyObject s2) {
//some code
}
}
関連
-
[解決済み] if / for / while 内で "Missing return statement" が発生する。
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み】StringUtils.isBlank() vs String.isEmpty()
-
[解決済み】不正な反射的アクセスとは?
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み] hibernate のプロパティが見つかりません。
-
[解決済み】java.io.IOException: 壊れたパイプ
-
[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
-
[解決済み】フォルダに書き込もうとすると「java.nio.file.AccessDeniedException」が発生する件
-
[解決済み] チェックされていないキャストの警告に対処するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:'if'のない'else'エラー
-
[解決済み] hibernateでResultSetを抽出できない。
-
[解決済み】エラー。Selection does not contain a main type
-
[解決済み] 解決済み】Javaが「型をインスタンス化できない」というエラーを返す [重複] [重複]
-
[解決済み】Java JDK - doubleからintへの非可逆変換の可能性
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】「java -cp」と「java -jar」の違い?
-
[解決済み】java 'jar'が内部コマンドまたは外部コマンドとして認識されない。
-
[解決済み] エラー - trustAnchors パラメータは空であってはなりません。
-
[解決済み】CreateProcess error=2, The system cannot find file specified.