带有Objects的ArrayList,找到重复的对象字段

时间:2015-01-28 14:10:04

标签: java oop object arraylist

就像标题所说,我在带有Objects的java中有一个ArrayList。物体基本上是酒店的房间类型。他们都有一个类型名称,床位等。现在我的问题是,我需要找到两个具有相同值的typename字段的对象。我已经通过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给出了一个更准确的答案。非常感谢你们:)

4 个答案:

答案 0 :(得分:1)

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

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

(我假设如果一个对象的所有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,那么,它将点头添加空间到集合,从而允许您最终得到KamerType个对象的列表是独一无二的。

  3. 作为次要说明,我在您的代码中也注意到了这一点: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字段的任何两个对象将完全相邻,因此您可以在没有{{1}的情况下找到重复项时间复杂度。

      • 这样您就可以拨打O^2并让它以您想要的方式对您的收藏品进行排序。

答案 1 :(得分:0)

比较字符串,使用&#39; equals&#39;功能而不是&#39; ==&#39;

像这样

如果(kamertypes.get(1).typeNaam.equals(KT.typeNaam))

答案 2 :(得分:0)

首先为您的字段创建一个getter方法:

public String getTypeNaam() {
    return typeNaam;
}

然后你可以比较两个值:

if(kt1.getTypeNaam().equals(kt2.getTypeNaam)) {
     // Name of kt1 and kt2 is identical
}

如果要比较彼此的每个对象,请使用嵌套循环:

for(KamerType kt1 : kamertypes){
    for(KamerType kt2 : kamertypes) {
         if(kt1.getTypeNaam().equals(kt2.getTypeNaam)) {
              // Name of kt1 and kt2 is identical
         }
    }
}

请注意,这也会找到两个相同的对象,因为它们当然具有相同的名称。您可以通过向kt1 != k2添加条件if来排除这些。

答案 3 :(得分:0)

这是你需要的。首先为您的私人字段添加getter。我使用了i和j的循环来避免重复。

 for(int j = 0;j<kamertypes.size();j++){
            for(int i = j+1;i<kamertypes.size();i++){
                if(kamertypes.get(j).getTypeNaam().equals(kamertypes.get(i).getTypeNaam()) && i!=j){
                    System.out.println(kamertypes.get(j) + "    and "  +kamertypes.get(i));
                }
            }

        }