Java 使用类方法查找ArrayList中的类似整数

Java 使用类方法查找ArrayList中的类似整数,java,class,methods,arraylist,subclass,Java,Class,Methods,Arraylist,Subclass,我需要遍历和ArrayList对象,并查找多个对象具有相同值的变量。如下面的示例所示,我正在查看一个ArrayList,它有一个子类。我想做的就是找出这个示例代码中的房子或公寓是否共享相同的挂牌号。我尝试使用一个双循环和一个带有方法(sameListingNum)的增强循环,但我在解决这个问题时遇到了困难 多谢各位 // main client class public static void main(String[] args) { ArrayList<House

我需要遍历和ArrayList对象,并查找多个对象具有相同值的变量。如下面的示例所示,我正在查看一个ArrayList,它有一个子类。我想做的就是找出这个示例代码中的房子或公寓是否共享相同的挂牌号。我尝试使用一个双循环和一个带有方法(sameListingNum)的增强循环,但我在解决这个问题时遇到了困难

多谢各位

// main client class
public static void main(String[] args) 
    {
      ArrayList<House> listings = new ArrayList();

      listings.add(new House(0001, 200000.00));
      listings.add(new House(0201, 200000.00));
      listings.add(new House(0001, 200000.00));
      listings.add(new House(0401, 200000.00));
      listings.add(new House(0031, 200000.00));
      listings.add(new Condo(0401, 200000.00, 4));
      listings.add(new Condo(0001, 120000.00, 3));
      listings.add(new Condo(0301, 220000.00, 2));
      listings.add(new Condo(0001, 130000.00, 3));
      listings.add(new Condo(0201, 130000.00, 3));

      for(House currentHouse: listings)
        System.out.println(currentHouse);
      for(int i=0; i<listings.size()-1; i++)
      {
        for(int j=i+1; j<listings.size(); j++)
        {

        }
      } 

// House Class
public class House 
{
  public int listingNum;
  public double price; 

  public House()
  {
    listingNum = 0; 
    price = 0.00; 
  }  
  public House(int newListingNum, double newPrice)
  {
    listingNum = newListingNum;
    price = newPrice; 
  }  
  public int getListingNum()
  {
    return listingNum;
  }  
  public double getPrice()
  {
    return listingNum; 
  }
  public String toString()
  {
    return ("Listing number: "+listingNum+", Price: "+price);
  }
  public boolean sameListingNum(Object other)
  {
    if(!(other instanceof House))
      return false; 
    else {
      House objHouse = (House)other;
      if(listingNum - objHouse.getListingNum() == 0)
      {
        System.out.println("Same listing numbers: "
        +listingNum+", "+objHouse.getListingNum());
        return true;
      }
      else 
        return false;
    }
  }
}

// Condo Class
public class Condo extends House
{
  public int connectedUnits;

  public Condo()
  {
    super();
    connectedUnits = 0; 
  }
  public Condo(int newListingNum, double newPrice, int newConUnits)
  {
    super(newListingNum, newPrice);
    connectedUnits = newConUnits;
  }

  public double getPrice()
  {
    return price;
  }
  public int getListingNum()
  {
    return listingNum;
  }
  public int getConnectedUnits()
  {
    return connectedUnits; 
  }
  public String toString()
  {
    return super.toString()+", Number of connected unints: "+connectedUnits;
  }

public boolean sameListingNum(Object other)
          {
            if(!(other instanceof House))
              return false; 
            else {
              House objHouse = (House)other;
              if(listingNum - objHouse.getListingNum() == 0)
              {
                System.out.println("Same listing numbers: "
                +listingNum+", "+objHouse.getListingNum());
                return true;
              }
              else 
                return false;
            }
        }
//主客户端类
公共静态void main(字符串[]args)
{
ArrayList listings=新的ArrayList();
增加(新房(000120000.00));
新增(新房(0201200000.00));
增加(新房(000120000.00));
新增(新房(0401200000.00));
添加(新房(003120000.00));
新增(新公寓(0401200000.00,4));
新增(新公寓(000112000.00,3));
新增(新公寓(0301,220000.00,2));
新增(新公寓(000113000.00,3));
新增(新公寓(020113000.00,3));
用于(房屋当前房屋:房源)
系统输出打印LN(当前房屋);

对于(inti=0;i您可以使用列表映射对其进行分组,如Map>groups

然后你在列表上循环,将每个房子/公寓放在同一个挂牌号的组中。最后,你会有一个地图,其中每个条目都有相同挂牌号的所有房子/公寓

以下是一个示例:

Map<Integer, List<House>> groups = new HashMap<Integer, List<House>>();
for (House house:listings) {
   List<House> group = groups.get(house.getListingNum());
   if (group == null) {
     group = new ArrayList<House>();
     groups.put(house.getListingNum(), group);
   }
   group.add(house);
}

for (Entry<Integer, List<House>> entry:groups.entrySet()) System.out.println("Listing Number "+entry.getKey()+" Houses/condos: "+entry.getValue());
Map groups=newhashmap();
用于(房屋:房源){
List group=groups.get(house.getListingNum());
如果(组==null){
组=新的ArrayList();
groups.put(house.getListingNum(),group);
}
加组(房屋);
}
对于(条目:groups.entrySet())System.out.println(“清单编号”+Entry.getKey()+“房屋/公寓:”+Entry.getValue());
试试这个:

foreach(House h in listings)
{
if(listings.Exists(p => p.sameListingNum(h)))
{
//do something
}
}

另外两个答案可以交替使用,你可以在房子上实现可比性

public class House implements Comparable<House> 

@Override
public int compareTo(final House o) {
    return listingNum - o.listingNum;
}

请随意挑选。

我不熟悉使用此方法(列表地图)。您可以应用sameListingNum方法或其修改版本来完成此操作吗?您希望使用相同的列表编号对房屋和公寓进行分组吗?例如,所有0001:[房屋(0001,200000.00),房屋(0001,200000.00),公寓(0001,120000.00,3),公寓(0001,130000.00,3)]。全部0031:[房屋(003120000.00)]。全部0201:[公寓(020101130000.00,3),房屋(02012000.00)].等等…是的,这是基本意图,但我不想对ArrayList进行排序或修改ArrayList。这是一个基本的迭代并搜索类似的列表NUM。我希望这更有意义。使用建议的解决方案,您不会触及原始数组(只读取一次)。您只是在创建一个新的数据结构(组别图)将组合房屋/公寓放置在何处是有意义的。我唯一的问题是,这是一个类项目,我不尝试使用我们尚未涉及的方法。这似乎是一个容易遵循的逻辑。我将查看它并很快让您知道。效果很好,唯一的问题是它没有添加用于匹配变量的初始值因此,它会打印currentHouse的所有副本,但会否定S.O.P()中先前的初始列表。这将打印n-1的所有副本。
    Collections.sort(listings);

    int previousListing = Integer.MIN_VALUE;

    for (House currentHouse : listings) {
        if (currentHouse.getListingNum() == previousListing){
            System.out.println("Duplicate for " + currentHouse.getListingNum());
        }
        previousListing = currentHouse.getListingNum();
    }