Java Collections.sort() 即使声明了 comparable 也不起作用
Java Collections.sort() not working even though comparable is declared
这是我的界面class
public interface Thing {
int getVolume();
}
这是实现 Thing
的 class
Item.java
public class Item implements Thing, Comparable<Thing> {
private String name;
private int volume;
public Item(String name,int volume){
this.name = name;
this.volume = volume;
}
@Override
public int getVolume() {
return this.volume;
}
public String getName(){
return this.name;
}
@Override
public String toString(){
return name+" ("+volume+" dm^3)";
}
// @Override
@Override
public int compareTo(Thing another) {
if(this.getVolume() < another.getVolume()){
return -1;
}
if(this.getVolume() == another.getVolume()){
return 0;
}
else{
return 1;
}
}
}
当我尝试使用以下命令 运行 主程序时 运行 没问题
// 主要 program.java
public class Main {
public static void main(String[] args) {
// test your program here
List<Item> items = new ArrayList<Item>();
items.add(new Item("passport", 2));
items.add(new Item("toothbrash", 1));
items.add(new Item("circular saw", 100));
Collections.sort(items);
System.out.println(items);
}
}
但是当我尝试在另一个实现了 Thing 接口的 class 上 运行 Collections.sort() 时,我得到一个错误
这是实现 Thing 接口的框 class,当我尝试 运行 void sort() 函数中的 Collections.sort(store) 时,它甚至会给出错误store 是一个 List,Box class 实现了 Thing 接口,我在 Item.java class
中为 Thing 定义了 comparable
Box.java
public class Box implements Thing {
private int maximumCapacity;
private List<Thing> store;
public Box(int maximumCapacity) {
this.maximumCapacity = maximumCapacity;
this.store = new ArrayList<Thing>();
}
public boolean addThing(Thing thing) {
// I.E. if the item added does not make the total volume go to max capacity only
// then add
if (this.getVolume() + thing.getVolume() < this.maximumCapacity) {
store.add(thing);
return true;
}
return false;
}
@Override
public int getVolume() {
// we calculate things of all items in the boxes (current value)
int currentWeight = 0;
for (Thing t : store) {
currentWeight += t.getVolume();
}
return currentWeight;
}
public List<Thing> getStore() {
return store;
}
public int numOfItems(){
return this.store.size();
}
public void sort(){
Collections.sort(store); // *****does not work ****//
}
}
It gives an error above for sort as "No suitable method found for
sort(List <Thing>)."
我的问题是它是否可以在 main.java 项目以列表形式给出的程序中工作,那么为什么它不能在这里工作?
如何解决?
这是因为首先你排序 "item",然后你排序 "list thing"
因此,您可以使用 lambda 修复它:
Collections.sort(store, (o1, o2) -> {
your implementation of comparator
});
主要 class 你排序 List<Item>
其中 Item implements Thing, Comparable<Thing>
.
在Box
class中你尝试排序List<Thing>
,但是Thing
本身并没有实现Comparable<Thing>
。因此 Java 不知道如何排序 Thing
s.
要修复它,您要么必须为两个 Thing
提供一个比较器(正如 Александр Нестеров 所建议的那样),要么您声明 Thing implements Comparable<Thing>
:
public interface Thing extends Comparable<Thing>{
int getVolume();
//provide default method to sort any class which implements Thing
@Override
public default int compareTo(Thing another) {
return Integer.compare(this.getVolume(), another.getVolume());
}
}
我建议您定义 Thing 以扩展 Comparable,因为当您添加 类 不是 Comparable 时您的应用程序无法运行。
顺便说一下,您的 compareTo 看起来相当复杂。改为这样做:
int compareTo(Thing another) {
return this.getVolume() - another.getVolume();
}
在第一个程序中,你有
public class Item implements Thing, Comparable<Thing>
但是第二个,你只有
public class Box implements Thing
如果你想要排序工作,你需要实现 Comparable 或 Comparator(单独 class 只实现 Comparator)。
使 Thing 成为实现 Comparable 的抽象 class,以便 Thing 始终准备好进行排序。项目可以从事物
扩展
如果您使用的是 jdk 8 或更高版本,并且希望所有 类 实现 "Thing" 应该基于相同的参数进行排序,您应该将界面更改为此以提供默认值排序能力:
//extend your interface with comparable
public interface Thing extends Comparable<Thing>{
int getVolume();
//provide default method to sort any class which implements Thing
@Override
public default int compareTo(Thing another) {
if(this.getVolume() < another.getVolume()){
return -1;
}
if(this.getVolume() == another.getVolume()){
return 0;
}
else{
return 1;
}
}
}
现在Item和Box只需要实现Thing接口即可。
请按照建议尝试优化 compareTo() 方法
@Jo Witters
这是我的界面class
public interface Thing {
int getVolume();
}
这是实现 Thing
的 classItem.java
public class Item implements Thing, Comparable<Thing> {
private String name;
private int volume;
public Item(String name,int volume){
this.name = name;
this.volume = volume;
}
@Override
public int getVolume() {
return this.volume;
}
public String getName(){
return this.name;
}
@Override
public String toString(){
return name+" ("+volume+" dm^3)";
}
// @Override
@Override
public int compareTo(Thing another) {
if(this.getVolume() < another.getVolume()){
return -1;
}
if(this.getVolume() == another.getVolume()){
return 0;
}
else{
return 1;
}
}
}
当我尝试使用以下命令 运行 主程序时 运行 没问题 // 主要 program.java
public class Main {
public static void main(String[] args) {
// test your program here
List<Item> items = new ArrayList<Item>();
items.add(new Item("passport", 2));
items.add(new Item("toothbrash", 1));
items.add(new Item("circular saw", 100));
Collections.sort(items);
System.out.println(items);
}
}
但是当我尝试在另一个实现了 Thing 接口的 class 上 运行 Collections.sort() 时,我得到一个错误
这是实现 Thing 接口的框 class,当我尝试 运行 void sort() 函数中的 Collections.sort(store) 时,它甚至会给出错误store 是一个 List,Box class 实现了 Thing 接口,我在 Item.java class
中为 Thing 定义了 comparableBox.java
public class Box implements Thing {
private int maximumCapacity;
private List<Thing> store;
public Box(int maximumCapacity) {
this.maximumCapacity = maximumCapacity;
this.store = new ArrayList<Thing>();
}
public boolean addThing(Thing thing) {
// I.E. if the item added does not make the total volume go to max capacity only
// then add
if (this.getVolume() + thing.getVolume() < this.maximumCapacity) {
store.add(thing);
return true;
}
return false;
}
@Override
public int getVolume() {
// we calculate things of all items in the boxes (current value)
int currentWeight = 0;
for (Thing t : store) {
currentWeight += t.getVolume();
}
return currentWeight;
}
public List<Thing> getStore() {
return store;
}
public int numOfItems(){
return this.store.size();
}
public void sort(){
Collections.sort(store); // *****does not work ****//
}
}
It gives an error above for sort as "No suitable method found for sort(List <Thing>)."
我的问题是它是否可以在 main.java 项目以列表形式给出的程序中工作,那么为什么它不能在这里工作? 如何解决?
这是因为首先你排序 "item",然后你排序 "list thing"
因此,您可以使用 lambda 修复它:
Collections.sort(store, (o1, o2) -> {
your implementation of comparator
});
主要 class 你排序 List<Item>
其中 Item implements Thing, Comparable<Thing>
.
在Box
class中你尝试排序List<Thing>
,但是Thing
本身并没有实现Comparable<Thing>
。因此 Java 不知道如何排序 Thing
s.
要修复它,您要么必须为两个 Thing
提供一个比较器(正如 Александр Нестеров 所建议的那样),要么您声明 Thing implements Comparable<Thing>
:
public interface Thing extends Comparable<Thing>{
int getVolume();
//provide default method to sort any class which implements Thing
@Override
public default int compareTo(Thing another) {
return Integer.compare(this.getVolume(), another.getVolume());
}
}
我建议您定义 Thing 以扩展 Comparable,因为当您添加 类 不是 Comparable 时您的应用程序无法运行。
顺便说一下,您的 compareTo 看起来相当复杂。改为这样做:
int compareTo(Thing another) {
return this.getVolume() - another.getVolume();
}
在第一个程序中,你有
public class Item implements Thing, Comparable<Thing>
但是第二个,你只有
public class Box implements Thing
如果你想要排序工作,你需要实现 Comparable 或 Comparator(单独 class 只实现 Comparator)。
使 Thing 成为实现 Comparable 的抽象 class,以便 Thing 始终准备好进行排序。项目可以从事物
扩展如果您使用的是 jdk 8 或更高版本,并且希望所有 类 实现 "Thing" 应该基于相同的参数进行排序,您应该将界面更改为此以提供默认值排序能力:
//extend your interface with comparable
public interface Thing extends Comparable<Thing>{
int getVolume();
//provide default method to sort any class which implements Thing
@Override
public default int compareTo(Thing another) {
if(this.getVolume() < another.getVolume()){
return -1;
}
if(this.getVolume() == another.getVolume()){
return 0;
}
else{
return 1;
}
}
}
现在Item和Box只需要实现Thing接口即可。
请按照建议尝试优化 compareTo() 方法 @Jo Witters