2013-10-24 2 views
0

Мне нужно выполнить итерацию объектов ArrayList и найти переменную, которая имеет одинаковое значение для нескольких объектов. В качестве примера ниже я просматриваю ArrayList, у которого есть подкласс. Все, что я хочу сделать, это выяснить, имеет ли дом или кондо один и тот же номер листинга для этого примера кода. Я попытался использовать двойной цикл и расширенный цикл с методом (sameListingNum), и у меня возникли проблемы с его устранением.Найти похожие целые числа внутри ArrayList с помощью метода класса

Спасибо

// 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; 
      } 
     } 

ответ

1

Вы можете сгруппировать его с помощью карты из списка, как карты> группы.

Затем вы перебираете список, и для каждого дома/кондоминиума вы помещаете его в группу того же номера листинга. В конце вы получите карту, где для каждой записи есть все дома/виллы с таким же номером листинга.

Здесь образца:

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

Я не знаком с использованием этого метода (Карта списка). Можете ли вы применить тот же методListingNum или модифицированную версию для этого, чтобы это возможно? – JRW2252

+0

Вы хотите сгруппировать дома и квартиры с таким же листинговым номером? Например, все 0001: [Дом (0001, 200000.00), Дом (0001, 200000.00), Кондо (0001, 120000.00, 3), Кондо (0001, 130000.00, 3)]. Все 0031: [Дом (0031, 200000.00)]. Все 0201: [Кондоминиум (0201, 130000.00, 3), Дом (0201, 200000.00)]. И так далее ... – Fedy2

+0

Да, это основная цель, но я не хочу сортировать ArrayList или изменять ArrayList. Это базовая итерация и поиск аналогичного спискаNums. Надеюсь, это имеет смысл. – JRW2252

0

Попробуйте это:

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

Оба из других 2 ответов будет работать Alternativly вы можете реализовать сопоставимый по палате ... например.

public class House implements Comparable<House> 

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

then inside your main method. Сортировка коллекции и проверка, чтобы увидеть, имеет ли предыдущая строка одинаковый идентификатор все время.

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

возьмите ваш выбор.

+0

Похоже на легкую логику. Я проверю это и дам вам знать в ближайшее время. – JRW2252

+0

Работает отлично, и единственная зацепка заключается в том, что она не добавляет начальное значение, которое использовалось для переменной соответствия в S.O.P (дублирующий список). Таким образом, он печатает все дубликаты для currentHouse, но отменяет исходный предыдущий идентификатор из S.O.P(). Это печатает полные дубликаты n - 1. – JRW2252

Смежные вопросы