我正在尝试将乘客对象添加到排序集中。此排序集位于巡航对象中。所有巡航对象都在哈希映射中。我对收藏有点陌生,所以我遇到了麻烦。这是我尝试做我正在做的事情。
HashMap<String, Cruise> cruiseMap = new HashMap<String, Cruise>();
SortedSet<Passenger> passengerSet = new TreeSet<Passenger>();
Queue<Passenger> waitingList = new LinkedList<Passenger>();
Cruise cruise = new Cruise("1", passengerSet, waitingList, false);
cruiseMap.put("1", cruise);
Passenger passenger = new Passenger("Smith", "J");
cruiseMap.get("1").getPassengerSet().add(passenger);
乘客的参数是字符串,这些字符串是姓氏,然后是他们的第一个首字母。邮轮的参数是日期的字符串,排序设置乘客,等待列表队列和布尔变量来确定船是否已出发。当我运行这段代码时,我不断收到大量错误。提前感谢您的帮助。
这是我收到的错误。
Exception in thread "main" java.lang.ClassCastException: edu.ilstu.Passenger cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at edu.ilstu.Driver.main(Driver.java:48)
乘客舱位
public class Passenger {
private String lastName = "";
private String firstName = "";
public Passenger()
{
lastName = "no last name yet";
firstName = "no first name yet";
}
public Passenger(String lastName, String firstName)
{
this.lastName = lastName;
this.firstName = firstName;
}
/**
* @return the lastName
*/
public String getLastName()
{
return lastName;
}
/**
* @param lastName the lastName to set
*/
public void setLastName(String lastName)
{
this.lastName = lastName;
}
/**
* @return the firstName
*/
public String getFirstName()
{
return firstName;
}
/**
* @param firstName the firstName to set
*/
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return lastName + " " + firstName;
}
}
邮轮舱
public class Cruise
{
private String day = "";
private SortedSet<Passenger> passengerSet = new TreeSet<Passenger>();
private Queue<Passenger> waitingList = new LinkedList<Passenger>();
private boolean hasDeparted = false;
public Cruise()
{
day = "no day yet";
passengerSet = null;
waitingList = null;
hasDeparted = false;
}
public Cruise(String day, SortedSet<Passenger> passengerSet, Queue<Passenger> waitingList, boolean hasDeparted)
{
this.day = day;
this.passengerSet = passengerSet;
this.waitingList = waitingList;
this.hasDeparted = hasDeparted;
}
/**
* @return the day
*/
public String getDay()
{
return day;
}
/**
* @param day the day to set
*/
public void setDay(String day)
{
this.day = day;
}
/**
* @return the passengerSet
*/
public SortedSet<Passenger> getPassengerSet()
{
return passengerSet;
}
/**
* @param passengerSet the passengerSet to set
*/
public void setPassengerSet(SortedSet<Passenger> passengerSet)
{
this.passengerSet = passengerSet;
}
/**
* @return the waitingList
*/
public Queue<Passenger> getWaitingList()
{
return waitingList;
}
/**
* @param waitingList the waitingList to set
*/
public void setWaitingList(Queue<Passenger> waitingList)
{
this.waitingList = waitingList;
}
/**
* @return the hasDeparted
*/
public boolean isHasDeparted()
{
return hasDeparted;
}
/**
* @param hasDeparted the hasDeparted to set
*/
public void setHasDeparted(boolean hasDeparted)
{
this.hasDeparted = hasDeparted;
}
}
发生这种情况是因为您的passengerSet
TreeSet
(SortedSet
(,这意味着它将在每次添加后自行排序,因为TreeSet
是有序集合并且具有与通常HashMap
不同的某些顺序。每个SortedMap
都必须知道如何对它所包含的元素进行排序。这可以通过两种方式完成:
- 您可以从
Comparable<T>
接口实现您的类。 - 您可以将自定义
Comparator<T>
添加到SortedMap
。
因此,您有三种方法可以修复它(可能更多,但其中三种 - 很明显(:
- 摆脱
SortedMap
,假设将SortedMap
替换为Map
,并将TreeMap
替换为代码中的HashMap
。 -
将自定义比较器添加到您的
passengerSet
HashMap<String, Cruise> cruiseMap = new HashMap<String, Cruise>(); SortedSet<Passenger> passengerSet = new TreeSet<Passenger>(new Comparator<Passenger>() { @Override public int compare(Passenger lhs, Passenger rhs) { return lhs.getFirstName().compareTo(rhs.getFirstName()); } }); Queue<Passenger> waitingList = new LinkedList<>(); Cruise cruise = new Cruise("1", passengerSet, waitingList, false); cruiseMap.put("1", cruise); Passenger passenger = new Passenger("Smith", "J"); cruiseMap.get("1").getPassengerSet().add(passenger);
-
在
Passenger
类中实现Comparable<T>
接口。public class Passenger implements Comparable<Passenger> { private String lastName = ""; private String firstName = ""; public Passenger() { lastName = "no last name yet"; firstName = "no first name yet"; } public Passenger(String lastName, String firstName) { this.lastName = lastName; this.firstName = firstName; } /** * @return the lastName */ public String getLastName() { return lastName; } /** * @param lastName the lastName to set */ public void setLastName(String lastName) { this.lastName = lastName; } /** * @return the firstName */ public String getFirstName() { return firstName; } /** * @param firstName the firstName to set */ public void setFirstName(String firstName) { this.firstName = firstName; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return lastName + " " + firstName; } @Override public int compareTo(Passenger another) { return firstName.compareTo(another.firstName); } }