Java 关于排序数组列表

Java 关于排序数组列表,java,arrays,sorting,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);

我试图确保我在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();

}
import java.util.ArrayList;
导入java.util.Collection;
公共类产品数据库{
私有ArrayList产品数据库;
公共产品数据库(){
productDatabase=new ArrayList();
}
公共产品(产品p){
如果(!productDatabase.contains(p)){
productDatabase.add(p);
}
}
公共数据库(){
for(产品:productDatabase){
系统输出打印项次(产品);
}
}
公共无效sortDatabase(){
// ????????????????????????????????????????????????????????????
所以我的问题是

  • 是否包含(p)足以确保同一产品不在列表中
  • 当产品有相同的代码和名称时,它们是相同的。如果不是,我该怎么办
  • 我如何使用类ProductDatabase中的比较器对我的产品进行排序。可能是通过product中的新方法
  • productDatabase是否扩展了产品

  • 你的问题1和2有点不清楚。你能重新编写它们吗?至于问题3。没有ProductDatabase不扩展product,它也不应该扩展product。ProductDatabase产品。ProductDatabase不是产品

    你可以返回布尔值,以知道产品是否已经存在。使用代码为确保产品的差异化,如果不添加另一个代码id。 产品实例将只携带一个产品的信息,因此必须在类的成员函数中进行排序,该类包含产品的所有记录,而不仅仅是一个记录。 没有产品\数据库不扩展产品。它是产品类的日志,而不是一部分

  • 是的,
    contains()
    足以确保唯一性(在我们的例子中)
  • 既然您实现了
    equals
    hashCode
    ,那么您就很好了
  • 如果没有其他目的,则无需对进行排序,但由于每次调用
    contains()
    时都使用ArrayList,因此它会迭代整个列表,这不是很有效。更好的实现方法是使用
    Set
    (例如
    HashSet
  • ProductDatabase
    不必扩展
    Product
    ——它包含一个产品列表/集合,但没有任何类似
    Product
  • 是的,contain(p)足以确保相同的产品不在列表中,因为您重写了“equals”方法。 在“equals”中,可以使用较短的结构:

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

    • 排序(列表,比较器c)。您必须编写自己的比较器类并作为第二个参数传递

    • 集合。排序(列表)和类产品必须实现可比较的接口

  • 是的,Contain(p)足以确保同一产品不在列表中,但这是无效的。请使用集合而不是ArrayList


    对于问题2,您必须确定两个产品何时相等,并在您的equals方法中对其进行编码,就像您对“产品代码”所做的那样。

    是否有任何特殊原因您不能使用
    Set
    而不是
    List
    ?您能更具体一点吗?我是java环境的新手为什么不想使用比较器?集合不允许使用比较器将要插入的重复元素保存在
    包含的内容中
    检查如果您不想使用comperator,则可以实现
    compareTo()
    (接口
    Comparable
    )我是java新手,所以我的问题可能对您没有意义。首先,我希望在应用程序类中,正如您所看到的,确保p2不会双重插入数组中。我的另一个问题是如何在product类中使用方法,我可能在方法sortDatabase中调用该方法,我可以按productprices对数组进行排序
    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(){
    
    // ????????????????????????????????????????????????????????????
    
    Product other = (Product)o;
    return this.code == other.code;