Reputation: 413
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");
}
}
}
Why it is writing:
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)
Upvotes: 38
Views: 133326
Reputation: 394
I faced a similar kind of issue while using a custom object as a key in Treemap. Whenever you are using a custom object as a key in hashmap then you override two function equals and hashcode, However if you are using ContainsKey method of Treemap on this object then you need to override CompareTo method as well otherwise you will be getting this error Someone using a custom object as a key in hashmap in kotlin should do like following
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()
}
}
Upvotes: 5
Reputation: 46543
Comparable
is Fegan
.The method compareTo
you are overidding in it should have a Fegan
object as a parameter whereas you are casting it to a FoodItems
. Your compareTo
implementation should describe how a Fegan
compare to another Fegan
.
FoodItems
implement Comparable
aswell and copy paste your actual compareTo
logic in it.Upvotes: 26