我有一個如下所示的列表。假設它有16個Container對象。每個Container對象都是一個簡單的bean,具有諸如年齡,體重,身高等字段。如果如果重量和高度相等時「容器」對象被認爲是相等的,我如何創建包含常見「容器」對象的子列表?從數組列表中提取常見對象
List<Container> containers = new ArrayList<Container>();
我有一個如下所示的列表。假設它有16個Container對象。每個Container對象都是一個簡單的bean,具有諸如年齡,體重,身高等字段。如果如果重量和高度相等時「容器」對象被認爲是相等的,我如何創建包含常見「容器」對象的子列表?從數組列表中提取常見對象
List<Container> containers = new ArrayList<Container>();
感謝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;
}
如果「普通」集裝箱你的意思是重複的,那麼這段代碼可以幫助你:
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;
}
}
}
如果你的意思是別的東西或需要澄清,請讓我知道。
是的,這與我目前爲止的代碼非常相似,但是如果高度相等,子列表元素只會被視爲相等。現在我在嘗試執行containers.removeAll(subList)時收到ConcurrentModificationException;主要思想是迭代「主列表」,創建子列表,從主列表中刪除子列表,清洗,清洗,重複,直到整個主列表耗盡了所有元素,並且我有一組可以使用的子列表。對異常有任何想法? – Jason 2015-01-15 16:49:11
好吧,如果你正在迭代你正在刪除元素的列表,這是你得到例外的地方,因爲你正在改變它的大小(通過刪除元素)。嘗試使用列表的迭代器(containers.iterator())並通過迭代器(it.remove())進行刪除以避免該異常。 – 2015-01-15 17:37:28