2015-01-15 61 views
0

我有一個如下所示的列表。假設它有16個Container對象。每個Container對象都是一個簡單的bean,具有諸如年齡,體重,身高等字段。如果如果重量和高度相等時「容器」對象被認爲是相等的,我如何創建包含常見「容器」對象的子列表?從數組列表中提取常見對象

List<Container> containers = new ArrayList<Container>(); 

回答

0

感謝John Smith對這個問題的指導。我使用了迭代器,並能夠爲我所尋找的東西提供一個很好的解決方案。下面是解決方案。請注意,Containers比較會覆蓋.equals。我使用的技術將採用主列表並創建子列表,同時從父列表中刪除元素。直到您將主列表轉換爲列表的一個子集,才能調用該解決方案。

public List<Container> extractCommonSubList(
     List<Container> masterContainerList) { 

    List<Container> subList = new ArrayList<Container>(); 
    ListIterator<Container> iterator = masterContainerList.listIterator(); 

    // get first item from master list and remove from master list 
    Container firstContainer = iterator.next(); 
    iterator.remove(); 

    // Add first container to sublist 
    subList.add(firstContainer); 

    while (iterator.hasNext()) { 

     Container container = iterator.next(); 

     // Search for matches 
     if (firstContainer.equals(container)) { 
      // containers are a match, continue searching for matches 
      subList.add(container); 
      iterator.remove(); 
      continue; 
     } else { 
      break; 
     } 

    } 

    // return common list 
    return subList; 

} 
1

如果「普通」集裝箱你的意思是重複的,那麼這段代碼可以幫助你:

import java.util.ArrayList; 
import java.util.List; 


public class CommonContainers { 
    public static void main(String[] args) { 
     List<Container> containers = new ArrayList<Container>(16); 
     for(int i=0; i<13; i++) { 
      containers.add(new Container(i, i)); 
     } 
     //add a few duplicating ones 
     containers.add(new Container(1,1)); 
     containers.add(new Container(5,5)); 
     containers.add(new Container(6,6)); 

     List<Container> sublist = new ArrayList<Container>(); 
     for (Container c1 : containers) { 
      for (Container c2 : containers) { 
       if(c1 != c2 && c1.equals(c2)) { 
        sublist.add(c1); 
       } 
      } 
     } 

     for (Container c : sublist) { 
      System.out.println(c); 
     } 
    } 

    private static class Container { 
     private int weight; 
     private int height; 

     @Override 
     public String toString() { 
      return String.format("Container[w=%d,h=%d]", weight, height); 
     } 

     public Container(int weight, int height) { 
      this.weight = weight; 
      this.height = height; 
     } 

     public int getWeight() { 
      return weight; 
     } 

     public void setWeight(int weight) { 
      this.weight = weight; 
     } 

     public int getHeight() { 
      return height; 
     } 

     public void setHeight(int height) { 
      this.height = height; 
     } 

     @Override 
     public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + height; 
      result = prime * result + weight; 
      return result; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (this == obj) 
       return true; 
      if (obj == null) 
       return false; 
      if (getClass() != obj.getClass()) 
       return false; 
      Container other = (Container) obj; 
      if (height != other.height) 
       return false; 
      if (weight != other.weight) 
       return false; 
      return true; 
     } 
    } 
} 

如果你的意思是別的東西或需要澄清,請讓我知道。

+0

是的,這與我目前爲止的代碼非常相似,但是如果高度相等,子列表元素只會被視爲相等。現在我在嘗試執行containers.removeAll(subList)時收到ConcurrentModificationException;主要思想是迭代「主列表」,創建子列表,從主列表中刪除子列表,清洗,清洗,重複,直到整個主列表耗盡了所有元素,並且我有一組可以使用的子列表。對異常有任何想法? – Jason 2015-01-15 16:49:11

+0

好吧,如果你正在迭代你正在刪除元素的列表,這是你得到例外的地方,因爲你正在改變它的大小(通過刪除元素)。嘗試使用列表的迭代器(containers.iterator())並通過迭代器(it.remove())進行刪除以避免該異常。 – 2015-01-15 17:37:28