道歉,如果这是一个愚蠢的问题,我对编程相对较新。
基本上我有一个家庭作业问题来创建一个邮局场景,支持两种类型的项目:空中发送的项目和海上发送的项目。对于每种类型,我使用calcFee方法计算总运费。
作业的第二部分要求扩展Item类,以便它实现Comparable接口,其中的项目按其calcFee值排序。现在我明白原始数据类型无法从Comparable接口中排序。因为问题特别要求使用Comparable接口我做错了什么或者我只是错误地创建程序
非常感谢任何帮助。
package homework3;
import java.util.ArrayList;
import java.util.Collections;
/**
*
* @author Josh
*/
public class Homework3 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ArrayList<Item> items = new ArrayList();
items.add(new airItems(11, "josh", "sam", 295));
items.add(new airItems(11, "zosh", "sam", 295));
items.add(new seaItems(11, "aosh", "sam", 11, 12, 15));
Collections.sort(items);
for (Item i : items){
i.calcFee();
i.print();
}
}
}
class Item implements Comparable<Item>{
int id;
String from;
String to;
double fee;
public Item(int id, String from, String to){
this.id = id;
this.from = from;
this.to = to;
}
public void print(){
System.out.println("id: " + id + "\tFrom: " + from + "\tTo: " + to + "\tFee: " + fee);
}
public double calcFee(){
return 0;
}
@Override
public int compareTo (Item item1){
return this.fee.compareTo(item1.calcFee());
}
}
class airItems extends Item{
long weight;
public airItems(int id, String from, String to, int weight){
super(id, from, to);
this.weight = weight;
}
public void print(){
super.print();
System.out.println("Weight: " + weight);
System.out.println("");
}
@Override
public double calcFee(){
if (weight < 100){
fee = 2.5;
}
else if (weight < 200) {
fee = 5;
}
else if (weight < 300) {
fee = 7.5;
}
return fee;
}
}
class seaItems extends Item{
int length;
int width;
int depth;
public seaItems(int id, String from, String to, int length, int width, int depth){
super(id, from, to);
this.length = length;
this.width = width;
this.depth = depth;
}
@Override
public double calcFee(){
if (length <= 10 && width <= 10 && depth <= 10){
fee = 5;
}
else if (length <= 20 && width <= 20 && depth <= 20){
fee = 10;
}
if (length <= 50 && width <= 50 && depth <= 50){
fee = 5;
}
else if (length > 50 && width > 50 && depth > 50 ){
fee = 0;
}
return fee;
}
@Override
public void print(){
super.print();
System.out.println("Length: " + length + "\tWidth:" + width + "\tdepth" + depth);
System.out.println("");
}
}
答案 0 :(得分:0)
就我而言,原始数据类型可以与Comparable
接口一起使用,但不鼓励它,因为它太复杂和不必要,通常需要进行一些黑客攻击(尽管我并不完全确定如此不要相信我的意思。)
至于您的任务,最简单的方法是创建一个新的List<Item>
并使用Comparable
界面使用.stream
对其进行排序:
List<Item> collect = items.stream()
.sorted(Comparator.comparingDouble((Item it) -> it.calcFee()).reversed())
.collect(toList());
collect.forEach(it-> System.out.println(it));
我在这里使用了lambda表达式,但成员引用也是可以接受的:
(Item::calcFee)
现在,这不适用于@Override
print
函数,您必须覆盖toString
,因为函数需要返回String。这可以通过这样做来实现:
@Override
public String toString() {
return "id: " + id + "\tFrom: " + from + "\tTo: " + to + "\tFee: " + fee;
}
结果如下:
id: 11 From: josh To: sam Fee: 7.5
id: 11 From: josh To: sam Fee: 5.0
答案 1 :(得分:0)
使用compare()
的{{1}}方法:
Double
如果@Override
public int compareTo (Item item){
return Double.compare(calcFee(), item.calcFee());
}
尚未初始化,最好使用calcFee()
而不是fee
。除非你有数以万计的项目,否则它不会产生太大的性能差异。