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