为什么这种排序数组不起作用?

时间:2011-02-13 03:40:49

标签: java arrays sorting

我必须在这里排序一个数组是我的代码。当我尝试使用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;
    }
}

3 个答案:

答案 0 :(得分:2)

您的Item类未实现比较。 sort方法声明:“此外,数组中的所有元素必须是可相互比较的(即,e1.compareTo(e2)不得为数组中的任何元素e1和e2抛出ClassCastException。”

但是既然你想要按照两种不同的东西进行排序,那么实现可比较的东西不会让你走得太远,最好使用比较器(http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html)。

所以你的名字排序看起来像这样(只需将比较的方法部分(项目o1,项目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)。

好的,为了让内容得到很好的打印,我们首先在你的item类中添加一个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
    }
}

现在我们可以在任何想要打印项目数组内容的地方调用此函数,就像对它们进行排序一样!

答案 1 :(得分:1)

Arrays.sort使用Comparator来执行排序。 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());
        }
    });
}

答案 2 :(得分:0)

您需要在Item类中实现compareTo方法,并声明它以实现Comparable interface

有关示例,请参阅How to use Comparable