gpt4 book ai didi

java - 如何将对象添加到对象 HashMap 中的已排序集合

转载 作者:太空宇宙 更新时间:2023-11-04 13:59:25 25 4
gpt4 key购买 nike

我正在尝试将乘客对象添加到排序集中。该排序集位于巡航对象中。所有巡航对象都在 hashMap 中。我对 Collection 有点陌生,所以遇到了麻烦。这是我尝试做的事情。

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);

乘客的参数是由姓氏和名字首字母组成的字符串。游轮的参数是字符串形式的日期、已排序的乘客、等待列表的队列和用于确定船舶是否已出发的 boolean 变量。当我运行这段代码时,我不断收到大量错误。预先感谢您的帮助。

这是我收到的错误。

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;
}

}

最佳答案

发生这种情况是因为您的passengerSetTreeSet ( SortedSet ),这意味着每次添加后它都会自行排序,因为 TreeSet是有序集并且具有与通常不同的特定顺序 HashMap 。每SortedMap必须知道如何对其包含的元素进行排序。这可以通过两种方式完成:

  1. 您可以从 Comparable<T> 实现您的类(class)接口(interface)。
  2. 您可以添加自定义Comparator<T>给您SortedMap .

因此,您可以通过三种方法来修复它(可能更多,但其中三种 - 是显而易见的):

  1. 摆脱SortedMap ,假设替换您的 SortedMapMap并替换TreeMapHashMap在您的代码中。
  2. 将自定义比较器添加到您的 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);
  3. 实现 Comparable<T>您的Passenger中的界面类。

    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);
    }
    }

关于java - 如何将对象添加到对象 HashMap 中的已排序集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29461473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com