java - 带有对象的ArrayList,查找重复的对象字段

标签 java oop object arraylist

就像标题所说,我有一个带有对象的 java ArrayList。这些对象基本上是酒店的房间类型。它们都有类型名称、床位数量等。现在我的问题是,我需要找到两个具有相同类型名称字段值的对象。我已经用 for 循环遍历了列表,但不知道如何继续。这是我的代码:

import java.util.ArrayList;

public class KamerType {

    private String typeNaam;
    private int aantalBedden;
    private double prijsPerNacht;

    public KamerType(String tN, int aB, double pPN){
        typeNaam = tN;
        aantalBedden = aB;
        prijsPerNacht = pPN;
    }

    public String toString(){
        String s = "De kamer van type " + typeNaam + " heeft " +     aantalBedden + " bedden en kost " + prijsPerNacht + " euro.";
        return s;
    }

    public static void main(String a[]){
        ArrayList<KamerType> kamertypes = new ArrayList<KamerType>();
        KamerType k1 = new KamerType("Standaard", 2, 60.0);
        kamertypes.add(k1);
        KamerType k2 = new KamerType("DeLuxe", 2, 85.0);
        kamertypes.add(k2);
        KamerType k3 = new KamerType("DeLuxe", 4, 125.0);
        kamertypes.add(k3);
        KamerType k4 = new KamerType("Hiker", 2, 35.0);
        kamertypes.add(k4);

        System.out.println("Dit zijn de kamertypen:");
        for(KamerType KT : kamertypes){
            System.out.println(KT.toString());
        }

        System.out.println("\nTesten op zelfde typenaam:");

        for(KamerType KT : kamertypes){
            /*if(kamertypes.get(1).typeNaam == KT.typeNaam){
                ???
            }*/
        }

    } // end of main

}// end of class

感谢任何帮助:)

编辑:npinti 和 Djorde Ivanovic 给出了两个工作答案,npinti 给出了更具指导性的答案。非常感谢大家:)

最佳答案

由于这听起来像是家庭作业,因此我将尝试提供一些基本指南,而不是解决方案。

最基本的(尽管效率较低)方法是进行嵌套循环并比较房间:

(我假设如果一个对象具有相同的所有 3 个字段,那么我引用同一个对象。因此,这部分: AND (r1.aantalBedden != r2.aantalBedden)) AND ( r1.prijsPerNacht != r2.prijsPerNacht) 将帮助我避免说我有重复项(在比较同一对象时)。

for each KamerType r1 in kamertypes
    for each KamerType r2 in kamertypes
        if(((r1.typeNaam.equals(r2.typeNaam)) AND (r1.aantalBedden != r2.aantalBedden)) AND (r1.prijsPerNacht != r2.prijsPerNacht))
            print("We have duplicates");

另一种更标准(如果你愿意)的方法是:

  1. 让您的 KamerType 类重写 equals 方法,并对其进行更改,以便两个 KamerType 对象相同(如果它们具有相同的 typeNaam 字段。

  2. 使用数据结构,例如 Set (不允许重复)并将您的 KamerType 对象放入其中。这将在内部调用 equals 方法,如果它产生 true,那么它将点头将房间添加到集合中,从而允许您最终得到 列表code>KamerType 对象是唯一的。

作为一个小注释,我也在您的代码中注意到了这一点:if(kamertypes.get(1).typeNaam == KT.typeNaam)。在Java中,字符串比较是通过equals方法完成的,因此应该变成if(kamertypes.get(1).typeNaam.equals(KT.typeNaam))

编辑:根据您的评论,第二种方法可以让您通过浏览一次列表来解决问题。还有第三种方法可以解决这个问题,但是我认为这是我上面提供的两种解决方案中最糟糕的部分(实现起来稍微复杂,并且执行可能需要更长的时间)。

  1. 让您的 KamerType 类实现 Comparable界面。这将迫使您实现compareTo()*方法。在您的实现中,您只需(至少在本例中)比较 typeNaam。然后对列表进行排序。

  2. 获得排序列表后,从列表的第二个元素开始并将其与前一个元素进行比较。由于您的列表按 typeNaam 排序,因此具有相同 typeNaam 字段的任何两个对象都将在列表中完全相邻,因此您将能够找到重复项没有 O^2 时间复杂度。

    • 这将允许您调用 Collections.sort() 并使其按照您想要的方式对集合进行排序。

关于java - 带有对象的ArrayList,查找重复的对象字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28194336/

相关文章:

java - 在 Android 中,是否有理由为不打算翻译的字符串使用字符串资源?

java - java中的辅助对象是什么?

Javascript ES6 解构嵌套对象父级和子级分配变量

Spring 和贫血领域模型

php - 我可以在 Laravel 5 session 中保存对象、对象集合吗?

perl 中的对象数组?

java - JOGL:在指定位置绘制球体会导致问题

java - 当每个单元格都不可编辑时使 JTable 行可选择

c++ - 从带有空格分隔符的文本文件中将对象读入数组

c++ - 如何创建嵌套类的对象?