【问题标题】:Find similar integers inside of an ArrayList with Class Method使用类方法在 ArrayList 中查找相似的整数
【发布时间】:2013-11-03 09:40:32
【问题描述】:

我需要遍历对象的 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;
            }
        }

【问题讨论】:

    标签: java class methods arraylist subclass


    【解决方案1】:

    其他 2 个答案都可以交替使用,您可以在 House 上实现可比较...例如。

    public class House implements Comparable<House> 
    
    @Override
    public int compareTo(final House o) {
        return listingNum - o.listingNum;
    }
    

    然后在你的主要方法中。对 Collection 进行排序并检查上一行是否始终具有相同的 Id。

        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();
        }
    

    任君挑选。

    【讨论】:

    • 似乎是一个容易遵循的逻辑。我会检查一下并尽快通知您。
    • 效果很好,唯一的问题是它不会将用于匹配变量的初始值添加到 S.O.P(重复列表)中。因此,它打印 currentHouse 的所有重复项,但从 S.O.P() 中否定初始的 previousLIsting。这将打印 n - 1 的总重复数。
    【解决方案2】:

    您可以使用列表映射对其进行分组,例如 Map> 组。

    然后,您遍历您的列表,并为每个房屋/公寓将其放入相同列表编号的组中。最后,您将获得一张地图,其中每个条目都有具有相同列表编号的所有房屋/公寓。

    这里是一个示例:

    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());
    

    【讨论】:

    • 我不熟悉使用这种方法(列表地图)。您可以应用相同的ListingNum 方法或它的修改版本来完成此操作吗?
    • 您想将具有相同房源编号的房屋和公寓组合在一起吗?例如所有 0001:[House(0001, 200000.00), House(0001, 200000.00), Condo(0001, 120000.00, 3), Condo(0001, 130000.00, 3)]。所有 0031:[房屋 (0031, 200000.00)]。所有 0201:[Condo(0201, 130000.00, 3), House(0201, 200000.00)]。等等……
    • 是的,这是基本意图,但我不想对 ArrayList 进行排序或修改 ArrayList。这是一个基本的迭代和搜索类似的listingNums。我希望这更有意义。
    • 使用建议的解决方案,您不会触及原始数组(仅读取一次)。您只是在创建一个新的数据结构(组图)来放置分组的房屋/公寓。
    • 有道理。我唯一的问题是这是一个课堂项目,我没有尝试使用我们尚未涵盖的方法。
    【解决方案3】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-14
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2016-12-23
      • 2013-12-22
      相关资源
      最近更新 更多