使用Comparable接口处理原始数据类型

时间:2016-10-30 10:11:25

标签: java comparable

道歉,如果这是一个愚蠢的问题,我对编程相对较新。

基本上我有一个家庭作业问题来创建一个邮局场景,支持两种类型的项目:空中发送的项目和海上发送的项目。对于每种类型,我使用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("");
    }



}

2 个答案:

答案 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。除非你有数以万计的项目,否则它不会产生太大的性能差异。