2015-04-05 65 views
1

我正在嘗試將乘客對象添加到已排序的集合中。這個排序集合在巡航對象中。所有的巡航對象都在一個哈希映射中。我有點新收藏,所以我遇到了麻煩。這是我嘗試做我正在做的事情。如何將對象添加到對象的散列圖內的有序集合

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

乘客參數是字符串,它們是姓氏,然後是他們的第一個首字母。郵輪的參數是一個字符串日期,sortedSet乘客,有一個隊列等待列表和一個布爾變量來確定船是否已經離開。當我運行這段代碼時,我總是收到大量的錯誤。先謝謝您的幫助。

這是我收到的錯誤。

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

} 
+1

添加實際的錯誤你的問題,謝謝。 – RealSkeptic 2015-04-05 19:47:51

+0

請另外添加克魯斯和乘客類。 – JFPicard 2015-04-05 19:51:06

+0

該信息已添加。 – 2015-04-05 20:09:24

回答

0

這是因爲你的passengerSetTreeSetSortedSet),這意味着它在每次添加後自行解決,因爲TreeSet是有序集,並具有一定的序列不像平常HashMap。每個SortedMap必須知道如何對其包含的元素進行排序。這可以通過兩種方式完成:

  1. 您可以從Comparable<T>接口實現您的類。
  2. 您可以將自定義Comparator<T>添加到您的SortedMap

所以,你有三種方式來解決這個問題(可多了,但他們三個人 - 是顯而易見的):

  1. 擺脫SortedMap,假設取代你SortedMapMap和替換TreeMap到代碼中的HashMap
  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. 實現你PassengerComparable<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); 
        } 
    } 
    
相關問題