2010-04-01 98 views
0

這裏是我的代碼:如何使用compareto()對Person對象進行排序?

> import java.util.Scanner; 
    import java.util.Arrays; 

    /** 
    This class tests the Person class. 
    */ 
    public class PersonDemo 
    { 
    public static void main(String[] args) 
    { 
    int count = 0; 
    Scanner in = new Scanner(System.in); 

    boolean more = false; 
    Person first = null; 
    Person last = null; 
    while (more) 
    { 
     System.out.println(
      "Please enter the person's name or a blank line to quit"); 
     String name = in.nextLine(); 

     if (name.equals("")) 
     more = false; 
     else 
     { 
     Person p = new Person(name); //new person object created with inputted name 

     Person[] people = new Person[10]; //new array of 10 person objects 
     people[count] = p; //declare person object with index of variable count as the new person object        

     first = people[count]; // I have no idea what to do here. This is where I'm stuck. 
     last = people[count]; // I can't figure out what to do with this either. 

     first.compareTo(p); //call compareTo method on first and new person object 
     last.compareTo(p); //call compareTo method on last and new person object  

     count++; // increase count variable 
     } 
    } 

     System.out.println("First: " + first.toString()); 
     System.out.println("Last: " + last.toString()); 
    } 
    } 

而Person類:

/** 
    A person with a name. 
*/ 
public class Person implements Comparable 

{ 
/** 
    * Constructs a Person with a name. 
    * @param aName the person's name 
    */ 
public Person(String aName) 
{ 
    name = aName; 
} 

public String getName() 
{ 
    return name; 
} 

@Override 
public int compareTo(Object otherObject) 
{ 
    Person other = (Person)otherObject; 
    if (name.compareTo(other.name) < 0) return -1; 
    if (name.compareTo(other.name) > 0) return 1; 
    return 0; 
} 

/** 
     Returns a string representation of the object. 
     @return name of Person 
*/ 
public String toString() 
{ 
    return "[name=" + name + "]"; 
    } 

private String name; 

} 
+0

這功課嗎? – 2010-04-01 04:11:07

回答

1

什麼你實際上缺少的是compareTo是你給到對象的功能。在你的例子中,你給出了一個Person實例與其他Person進行比較的能力,以實現總訂購該類的元素。

通常這個方法implictly使用JDK的集合像ListsSortedMaps等等,但你有一個陣列,這是一種基本類型的,所以你應該看看Arrays.sort(Object[])這會照顧有關使用訂購它接口爲Comparable

提示:因爲您的compareTo方法只適用於PersonString,您可以輕鬆地返回它的值而不是檢查它的行爲方式。

0

首先,讓您的數組創建在循環之外。其次,即使作業分配表示他們只會輸入10個名字,但您應該假設更多 - 您只需要索引IndexOutOfBoundsExceptions。考慮使用自動排序的類似TreeSet的集合。

sort an array

Person[] people = new Person[10]; 
// add elements to the array... 
java.util.Arrays.sort(people); 
first = people[0]; 
// etc... 

要排序集合(Set是沒有重複的集合)只使用TreeSet的,他們正在自動排序。

TreeSet<Person> people = new TreeSet<Person>(); // using generics to say "only Person objects are allowed" 
while (more) { 
    System.out.println("Please enter the person's name or a blank line to quit"); 
    String name = in.nextLine(); 

    if (name.equals("")) 
     more = false; 
    else 
     people.add(new Person(name)); 
} 

System.out.println("First: " + people.first()); 
System.out.println("Last: " + people.last()); 
+0

作業可能會說不使用集合/數組列表等等。儘管如果可以的話,我會使用一個類讓java爲你做。 – 2010-04-01 04:24:29

0

那麼,首先,你的代碼將不會做任何事情,直到你最初設置更多爲真。否則,當你試圖在空對象上調用tostring時,你會得到一個空指針異常。

此外,不要在while循環內創建person數組,否則每次都會重置它,並打敗似乎是存儲所有人的目的。

另外,考慮到對象foo和bar,動物園類的,你不能只是做:

foo.compareto(bar); 

這就好比只是有一樣

-4; 

一行代碼Java不喜歡它。

所以,回答你的問題,使用比較的方法,就像瓶坯真相測試。例如,

if(foo<bar) 
    /*Do something*/; 

除了,您可以使用.compareto(),以便您實際比較對象,而不是簡單的引用。所以,你可以通過比較他們與比較來確定動物園類型的哪個對象更大,foo或bar。 compareto的API規定,如果返回0,則它們相等,如果返回一個正數,則第一個更大,如果返回負數,則第二個更大。所以:

if(foo.compareto(bar) >0) 
    /* foo is greater*/; 
else if(foo.compareto(bar) = 0) 
    /* foo and bar are equal*/; 
else 
    /* bar is greater*/; 
相關問題