我如何通过可比接口对对象数组进行排序?

how do i sort an array of objects via the comparable interface?

编辑:我正在尝试按 "calories".

对数组对象进行排序

目前我正在做一项作业,其中一项任务是输出一个排序数组。

据我所知,我的数组排序失败可以通过可比较的接口解决。然后就可以使用 java.util.Arrays.sort(/var to be sorted here/) 方法对我的数组进行排序。

我知道我可以简单地编写另一个循环,但这不是我想要实现的。想法?

提前致谢。

源代码:

import java.util.Arrays;

public class Food implements Comparable<Food> 
{

    public static void main(String[] args) 
    {
        int n = 5;
        Food f1 = new Food(TYPES[1], 300); 
        Food f2 = new Food(TYPES[2], 400);

        System.out.println(Arrays.toString(createSortedRandomList(n)));
        System.out.println("f1 calories: " + f1.getCalories());
        System.out.println("f1 type: " + f1.getType());
        System.out.println("f2 calories: " + f2.getCalories());
        System.out.println("f2 type: " + f2.getType());
        System.out.println();

        System.out.println(f1.compareTo(f2));

    }

    private static final String[] TYPES = {"Apple", "Pear", "Cookie"};
    private String type;
    private int calories;

    public Food(String type, int calories)
    {
        this.type = type;
        this.calories = calories;
    }


    public String toString()
    {
        String foodString = "Type:" + getType() + " Calories:" + getCalories();
        return foodString;
    }



    public String getType() 
    {
        return type;
    }

    public int getCalories() 
    {
       return calories;
    }

    public static Food[] createSortedRandomList(int n) 
    {

        Food[] food = new Food[n];
        int i;

        for(i = 0; i < n; i++)
        {
            food[i] = new Food(TYPES[(int)(3.0*Math.random())], (int)(501 * Math.random())); // 0 <= calories <= 500
        }

        Arrays.sort(calories); // incorrect code here **************************************************************
        return food;

        // TODO: create a list with n random instances and sort them
    }

    public int compareTo(Food o) 
    {
        if (this == o)
        {
            return 0;
        }

        if (this.type.length()*this.calories < o.type.length()*this.calories)
        {
            return -1;
        }

        else
        {
            return 1;
        }

    }    

}

A class 实现 Comparable 意味着它有一个 "natural" 排序机制。

你为你的Foodclass定义的这个很奇怪,是根据类型的长度和卡路里的乘积。

我认为你需要的是一些外部比较器,每个比较器都比较你 class 的不同方面。

A public static class CaloriesComparator implements Comparator<Food>只能根据卡路里进行比较(然后可以根据食物类型进行比较)。

然后您可以创建一个 TypeComparator implements Comparator<Food>,它首先比较类型,只有当类型相等时才比较卡路里。

然后您可以在 Arrays.sort(<array>, <comparator instance>) 排序方法中使用它。

使用Java8,你可以更简单地编写比较器: Comparator<Food> comparator = Comparator.comparingDouble(Food::getCalories).thenComparing(Food::getType);

您的 compareTo 方法有一些拼写错误。 始终使用 Override 注释以确保覆盖正确的方法。 我改进了您的 toString 方法以查看比较是否正常工作。

public class 食具比较 {

public static void main(String[] args) 
{
    int n = 5;
    Food f1 = new Food(TYPES[1], 300); 
    Food f2 = new Food(TYPES[2], 400);

    System.out.println(Arrays.toString(createSortedRandomList(n)));
}

private static final String[] TYPES = {"Apple", "Pear", "Cookie"};
private String type;
private int calories;

public Food(String type, int calories)
{
    this.type = type;
    this.calories = calories;
}


public String toString()
{
    String foodString = "Type:" + getType() + " Calories:" + getCalories()+ "\n";
    return foodString;
}



public String getType() 
{
    return type;
}

public int getCalories() 
{
   return calories;
}

public static Food[] createSortedRandomList(int n) 
{

    Food[] food = new Food[n];
    int i;

    for(i = 0; i < n; i++)
    {
        food[i] = new Food(TYPES[(int)(3.0*Math.random())], (int)(501 * Math.random())); // 0 <= calories <= 500
    }

    Arrays.sort(food);

    return food;

    // TODO: create a list with n random instances and sort them
}

@Override
public int compareTo(Food o) {
    if (this == o) {
        return 0;
    }else if (this.calories < o.calories) {
        return -1;
    } else if (this.calories == o.calories) {
        return 0;
    } else {
        return 1;
    }
}

}