似乎无法在java中对对象数组进行排序

时间:2015-11-12 20:06:32

标签: java arrays sorting compare

这是填充数组的对象的类

class InventoryItem implements Comparable<InventoryItem>{
String name;
double price = 0.0;
int quantity = 0;
int itemCount = 0;
public InventoryItem(String newName, double newPrice, int newQuantity){
    name = newName;
    price = newPrice;
    quantity = newQuantity;
    itemCount++;
}

public String toString(){
    String output = name + ", at " + Program4.moneyString(price) + " each.";
    output += " We have " + getQuantity() + " of them.\n";
    return output;
}

public String getName(){
    return name;
}

public int getQuantity(){
    return quantity;
}

public double getPrice(){
    return price;
}

public int compareTo(InventoryItem other){
    return getName().compareTo(other.getName());
}
}

我打算对数组进行排序

public static void sortByName(InventoryItem[] array){
    Arrays.sort(array);
}

这给了我错误

Exception in thread "main" java.lang.NullPointerException
at java.util.ComparableTimSort.binarySort(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at CSC120Program4.Program4.sortByName(Program4.java:97)
at CSC120Program4.Program4.processUserChoice(Program4.java:121)
at CSC120Program4.Program4.main(Program4.java:134)

我没有足够的经验知道如何解决这个问题,或者说我做错了什么。

编辑:正在构建的数组:

static InventoryItem[] inventoryItems = new InventoryItem[100];
public static void readAndStoreInventory(InventoryItem[] items, Scanner input){

    String[] params = new String[3];
    while(input.hasNextLine()){
        String name = "";
        double value = 0.0;
        int quantity = 0;
        params = (input.nextLine().split("#"));
        name = params[0];
        value = Double.parseDouble(params[1]);
        quantity = Integer.parseInt(params[2]);
        items[lastInUse + 1] = new InventoryItem(name, value, quantity);
        lastInUse++;
    }
    input.close();

正在读取的文件如下:

wooden baseball bat#3.67#10
rubber mallet#5.50#20
duffel bag#10.20#11
gold bar#9999.99#1
hitman rental#20000.00#99
minivan#15000.21#3
half full cup#2.00#10
half empty cup#10.00#10
lawn chair#12.34#100
used golf ball#0.99#2
cosby sweater#250.00#1
CSC120 cheatsheet#0.01#1

4 个答案:

答案 0 :(得分:2)

您正在创建一个包含100个元素的数组,但您只创建了几个项目。 所以当你对它进行排序时,它也会对这些空对象进行排序。您应该为此目的使用List。

您还可以尝试添加null-ptr检查:

public int compareTo(InventoryItem other){
if (other != null){
    return getName().compareTo(other.getName());
}
return 0
}

一个肮脏的修复方法是获取元素的大小并仅对添加的元素进行排序:(更好的方法是从头开始使用列表)

public static void sortByName(InventoryItem[] array){
    int counter = 0;
    for (int i = 0; i < array.length; i ++)
            if (array[i] != null){
            counter ++;
            break;
        }
    Arrays.sort(array, 0, counter-1);
}

答案 1 :(得分:0)

  

线程“main”中的异常java.lang.NullPointerException

可能意味着null正在访问其中的属性。可能在这里:

public int compareTo(InventoryItem other){
  return getName().compareTo(other.getName());
}

所以其中一个name为空。所以可能在这里:

params = (input.nextLine().split("#"));
name = params[0];

答案 2 :(得分:0)

InventoryItem数组初始化为100,如果您没有读取100行,那么您将为不存在的索引提供空指针。你需要使用List而不是java数组。

List<InventoryItem> inventoryItems = new List<InventoryItem>();

然后当你添加它们时,做这样的事情,

inventoryItems.add(new InventoryItem(name, value, quantity));

答案 3 :(得分:0)

Arrays.sort(Object[])期望数组中的所有元素都是!= null,因为它需要

  

数组中的所有元素必须相互可比较(即e1.compareTo(e2)......

您看到的是null.compareTo(something)的结果。

您的InventoryItem[] array可能有100个插槽,但并非所有插槽都已填满。

要解决这个问题,你可以