2011-02-13 67 views
1

我必須排序一個數組,這裏是我有的代碼。當我嘗試使用Arrays.sort()時,我收到了很多錯誤。任何人都知道我在做什麼錯了?這是我第一次用構造函數排序和使用數組。爲什麼這種排序數組不工作?

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

public class CoffeeDriver { 

//main method 
    public static void main (String[] args){ 


     Item[] itemObject = new Item[] { 
        new Item("Donut", .75), 
        new Item("Coffee", 1.00), 
        new Item("Bagel", 1.25), 
        new Item("Milk", 1.50), 
        new Item("Water", 2.00)}; 

     Scanner input = new Scanner(System.in); 

     String decision; 

     System.out.println ("Welcome to Wings Coffee Shop"); 
     System.out.println ("We have a great list of tasty items on our menu."); 
     System.out.println ("Would you like to see these items sorted by"); 
     System.out.println ("name or by price? (n/p): "); 
     decision = input.nextLine(); 
     sortName(itemObject); 
     sortPrice(itemObject); 
    } 

//method to sort by item name and display 
    public static void sortName (Item[] itemObject){ 
     Arrays.sort(itemObject); 
     System.out.println(itemObject); 
    } 

//method to sort by item price and display 
    public static void sortPrice (Item[] array){ 
     Arrays.sort(array); 
     for (int i = 0; i < array.length; i++){ 
      System.out.println (array[i]); 
      } 
    } 

} 

public class Item 
{ 

private String itemName = ""; //setting up the name 
    private double itemPrice=0.0; //Setting price variable 
    public Item(String name, double price) //Constructor 
    { 
     itemName = name; 
     itemPrice = price; 
    } 
    public String getitemName() //retuns name 
    { 
     return itemName; 
    } 
    public double getitemPrice() //returns price 
    { 
     return itemPrice; 
    } 
    public void setitemName(String name) //sets name 
    { 
     itemName = name; 
    } 
    public void setitemPrice (double price) //sets price 
    { 
     itemPrice = price; 
    } 
} 

回答

2

您的物品類不會執行compareable。排序方法規定:「此外,數組中的所有元素必須相互可比(即e1.compareTo(e2)不得爲數組中的任何元素e1和e2拋出ClassCastException)。」

但是既然你想按兩種不同的東西排序,實現可比性不會讓你感覺很差,所以最好使用比較器(http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html)。因此,按名稱排序看起來像這樣(只需將compare(Item o1,Item o2)的方法部分替換爲要排序的數組的條件)。

// method to sort by item name and display 
public static void sortName(Item[] itemObject) { 
    Arrays.sort(itemObject, new Comparator<Item>() { 
     @Override 
     public int compare(Item o1, Item o2) { 
      return o1.getitemName().compareTo(o2.getitemName()); 
     } 
    }); 
    printArr(itemObject); 
} 

和你sortPrice這樣的:

// method to sort by item price and display 
public static void sortPrice(Item[] array) { 
    Arrays.sort(array, new Comparator<Item>() { 
     @Override 
     public int compare(Item o1, Item o2) { 
      return Double.compare(o1.getitemPrice(), o2.getitemPrice()); 
     } 
    }); 
    printArr(array); 
} 

而且打印您的結果一般是一個不錯的易讀的方式一個好主意,覆蓋toString()方法的類,這樣你可以只寫System.out.println(item); (在這種情況下toString被自動調用)。

好吧獲取內容精細打印的,我們首先添加一個toString()方法,您的項目類:

@Override 
public String toString() { 
    return itemName + ": " + itemPrice; 
} 

這將只返回該項目的名稱叫時,它的價格。要現在打印陣列的內容很好地我們剛剛經歷它的所有成員進行迭代:

private static void printArr(Item[] arr) { 
    for(Item i : arr) { 
     System.out.println(i); // the same as System.out.println(i.toString()); - Java calls the toString method automatically in this case we you give it an object 
    } 
} 

現在我們可以對它們進行排序後僅調用此函數無處不在,你想打印一個項目數組的內容,喜歡!

+0

做上述給了我這個錯誤: [訴訟; @ 4bb1aa65 異常在線程 「主要」 java.lang.ClassCastException:項目不能轉換爲java.lang.Comparable的 \t在java.util中.Arrays.mergeSort(Arrays.java:1144) \t在java.util.Arrays.sort(Arrays.java:1079) \t在CoffeeDriver.sortPrice(CoffeeDriver.java:44) \t在CoffeeDriver.main(CoffeeDriver。 java:28) – allencoded 2011-02-13 03:53:31

+0

聽起來像你沒有改變你的sortPrice方法。上面只修復你的sortName - 你需要爲sortPrice做同樣的事情,但是替換return o1.getitemName()。compareTo(o2.getitemName());用return(int)(o1.getitemPrice() - o2。getitemPrice()); – Voo 2011-02-13 04:00:36

1

Arrays.sort需要Comparator用於執行排序。 A Comparator用於查找2個項目之間的差異。

public static void sortName (Item[] itemObject){ 
    Arrays.sort(itemObject, new Comparator<Item>() { 
     public int compare(Item a, Item b) { 
        if(a.getitemName() == null){ 
         return b.getitemName() == null ? 0 : -1; 
        } 
      return a.getitemName().compareTo(b.getitemName()); 
     } 
    }); 
} 

public static void sortPrice (Item[] array){ 
    Arrays.sort(array, new Comparator<Item>() { 
     public int compare(Item a, Item b) { 
      return Double.compare(a.getitemPrice(), b.getitemPrice()); 
     } 
    }); 
} 
相關問題