2011-02-13 71 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()); 
     } 
    }); 
} 
相关问题