import java.util.HashMap;
import java.io.*;
import java.util.*;
public class Fegan implements Comparable{
HashMap<String, Integer> cart = new HashMap<String, Integer>();
List list = new ArrayList<FoodItems>();
int x =0;
public void addToCart(FoodItems f)
{
cart.put(f.name, f.valueOfFood);
}
public String display(FoodItems f)
{
return(f.name + " costs " + f.valueOfFood);
}
public void addToList(FoodItems f)
{
//FoodItems temp = (FoodItems) f;
list.add(f);
}
public int compareTo(Object o)
{
//FoodItems temp = (FoodItems) o;
if(this.x == ((FoodItems)o).valueOfFood)
return 0;
else if (this.x <((FoodItems)o).valueOfFood)
return 1;
else
return -1;
}
public void sortMap(List list)
{
for(int i =0; i< list.size(); i++)
{
FoodItems temp = (FoodItems) list.get(i);
cart.put(temp.name, temp.valueOfItem);
}
}
}
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.io.*;
import java.util.*;
public class Test {
public static void main(String [] args)
{
HashMap<String, Integer> cart = new HashMap<String, Integer>();
FoodItems firts = new FoodItems("Chocolate" , 50);
FoodItems second = new FoodItems("Juice", 79);
FoodItems third = new FoodItems("Apple", 200);
FoodItems forth = new FoodItems("Orange", 300);
FoodItems fifth = new FoodItems("Milk" , 400);
ArrayList items = new ArrayList();
items.add(firts);
items.add(second);
items.add(third);
items.add(forth);
items.add(fifth);
Collections.sort(items);
Iterator itr = items.iterator();
Fegan myFegan = new Fegan();
myFegan.sortMap(items);
while(itr.hasNext()){
Object element = itr.next();
System.out.println(element + "\n");
}
}
}
为什么写作
Exception in thread "main" java.lang.ClassCastException: FoodItems cannot be cast to java.lang.Comparable
at java.util.ComparableTimSort.countRunAndMakeAscending(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at Test.main(Test.java:21)
提前谢谢!
答案 0 :(得分:17)
Comparable
的对象是Fegan
。您要覆盖的方法compareTo
应该有一个Fegan
对象作为参数,而您将其转换为FoodItems
。您的compareTo
实施应说明Fegan
与另一个Fegan
的比较。
FoodItems
工具Comparable
并复制粘贴您的实际compareTo
逻辑。答案 1 :(得分:0)
在使用自定义对象作为Treemap中的键时,我遇到了类似的问题。 每当将自定义对象用作hashmap中的键时,都将覆盖两个函数equals和hashcode,但是,如果在此对象上使用Treemap的ContainsKey方法,则还需要覆盖CompareTo方法,否则将收到此错误 在Kotlin中,使用自定义对象作为hashmap中的键的人应该喜欢
data class CustomObjectKey(var key1:String = "" , var
key2:String = ""):Comparable<CustomObjectKey?>
{
override fun compareTo(other: CustomObjectKey?): Int {
if(other == null)
return -1
// suppose you want to do comparison based on key 1
return this.key1.compareTo((other)key1)
}
override fun equals(other: Any?): Boolean {
if(other == null)
return false
return this.key1 == (other as CustomObjectKey).key1
}
override fun hashCode(): Int {
return this.key1.hashCode()
}
}