我如何通过可比接口对对象数组进行排序?
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" 排序机制。
你为你的Food
class定义的这个很奇怪,是根据类型的长度和卡路里的乘积。
我认为你需要的是一些外部比较器,每个比较器都比较你 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;
}
}
}
编辑:我正在尝试按 "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" 排序机制。
你为你的Food
class定义的这个很奇怪,是根据类型的长度和卡路里的乘积。
我认为你需要的是一些外部比较器,每个比较器都比较你 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;
}
}
}