关于排序数组列表

时间:2013-11-04 15:18:26

标签: java arrays sorting

我正在尝试确保我在productDatabase中插入的对象尚未插入,并且我使用方法sortData对我的arraylist进行排序,但不使用方法sortData中的任何比较器

public class Application {

public static void main(String[] args) {

    Product  p = new Product(15,"test",3.45);
    Product  p2 = new Product(15,"test",3.45);
    Product  p3 = new Product(4716,"koukouroukou",1.25);
    Product  p4 = new Product(6002,"bananofatsoula",0.60);

    ProductDatabase productDatabase = new ProductDatabase();

    productDatabase.addProduct(p);
    productDatabase.addProduct(p2);
    productDatabase.addProduct(p3);
    productDatabase.addProduct(p4);

    productDatabase.printDatabase();

    productDatabase.sortDatabase();
    productDatabase.printDatabase();

}
public class Product {

    private int code;
    private String name;
    private double price;

    public Product(int code, String name, double price){
        this.code = code;
        this.name = name;
        this.price = price;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String toString(){
        return code+" , description: "+name+", price: "+price;
    }

    public int hashCode(){
        return 31 * code + name.hashCode();
    }

    public boolean equals(Object o){
        Product other = (Product)o;
    if (this.code == other.code){
        return true;
    }
    else{ 
        return false;
    }
}
import java.util.ArrayList;

import java.util.Collection;


public class ProductDatabase {

private ArrayList<Product> productDatabase;

public ProductDatabase(){
    productDatabase = new ArrayList<Product>();
}

public void addProduct(Product p){
    if(!productDatabase.contains(p)){
        productDatabase.add(p);
    }
}

public void printDatabase(){
    for(Product product : productDatabase){
        System.out.println(product);
    }
}

public void sortDatabase(){

// ????????????????????????????????????????????????????????????

所以我的问题是

  1. 包含(p)是否足以确保相同的产品不在列表中?
  2. 当它们具有相同的代码和名称时,产品是相同的。如果不是我必须做什么?
  3. 我如何使用ProductDatabase.maybe类中的比较器通过产品中的新方法对我的withous进行排序?
  4. productDatabase是否扩展了Product ???

5 个答案:

答案 0 :(得分:2)

您可以返回bool值以了解产品是否已存在。如果不添加其他代码ID,代码用于确保产品的差异化。 产品实例将只包含一个产品的信息,因此必须在具有产品所有记录的类的成员函数中进行排序,而不仅仅是一个。 没有product_database不扩展产品。它是产品类别的日志而不是其中的一部分。

答案 1 :(得分:1)

你的问题1和2有点不清楚。你能重新写一下吗?至于问题3.没有ProductDatabase不扩展产品,也不应该扩展产品。 ProductDatabase HAS 产品。 ProductDatabase 不是产品

答案 2 :(得分:0)

  1. 是的,contains()就足够了(在我们的例子中)以确保唯一性
  2. 由于您实施了equalshashCode - 您很好
  3. 如果您没有其他目的,则不需要sort,但由于每次调用contains()时都使用ArrayList,它会迭代整个列表,即不是很有效率。更好的实施方式是使用Set(例如HashSet
  4. ProductDatabase不必扩展Product - 它包含一个列表/一组产品,但它没有任何字符/行为,例如Product

答案 3 :(得分:0)

  1. 是的,包含(p)足以确保相同的产品不在列表中,因为您覆盖了“等于”方法。 在“等于”中,您可以使用更短的构造:

    Product other = (Product)o;
    return this.code == other.code;
    
  2. 对于带有java.util.Collections的排序ArrayList,可以选择两个选项:

    • Collections.sort(列表列表,比较器c)。你必须编写自己的Comparator类并作为第二个参数传递。

    • Collections.sort(列表列表)和类Product必须实现Comparable接口

答案 4 :(得分:0)

是的,包含(p)足以确保相同的产品不在列表中但是效率不高。使用Set而不是ArrayList。

对于问题2,你必须决定两个产品相等的时间,并在你的equals方法中编码,就像你为'产品代码'所做的那样