2017-04-03 79 views
1

我想獲得下面的
1.兩個列表之間的通用元素。
2.元素數組listB這是不提供利斯塔在利斯塔
三要素是不可用數組listB找到兩個列表中的常見元素和不同元素java中的列表

List<String> fruitsListA = new ArrayList<String>(); 
fruits.add("Apple"); 
fruits.add("Banana"); 
fruits.add("Grapes"); 
List<String> fruitsListACopy = fruitsListA; 

List<String> fruitsListB = new ArrayList<String>(); 
fruits.add("Strawberry"); 
fruits.add("Cranberry"); 
fruits.add("Orange"); 
fruits.add("Apple"); 
List<String> fruitsListBCopy = fruitsListB; 

1. common elements between two list 

    fruitsListACopy.retainAll(fruitsListB); 

2. Elements in ListB which is not available in ListA 

    fruitsListB.removeAll(fruitsListA); 

3. Elements in ListA which is not available in ListB 

    fruitsListA.removeAll(fruitsListBCopy); 

的情況下1:IM能夠獲得兩個列表中常見的物品。所以如果我打印fruitsListACopy它給['蘋果']

案例2:我可以看到fruitsListA自動修改我的意思,而不是所有的項目['蘋果','香蕉','葡萄']它只有普通商品 ['Apple']。我可以看到fruitsListB被自動修改我的意思是不是所有的項目['草莓','蔓越莓','橙','蘋果']它只有 ['Strawberry','蔓越莓','Orange'],並取消蘋果產品。
我甚至可以看到fruitsListA被自動修改我的意思是不是所有的項目['蘋果','香蕉','葡萄']它只有普通項目 ['Apple']。

當我使用removeAll和retainAll方法時,複製列表中所做的更改反映在原始列表中。

有沒有其他最好的方法來滿足這種需求?

+0

複製的變量是引用。他們指着原來的名單。因此,如果您在複製的變量中進行更改,他們也會更新原始列表。 –

+0

您需要對列表進行所謂的「深層複製」而不是「淺拷貝」,因爲只有引用包含在您的列表中。 – alexandrum

回答

0

我甚至可以看到當你像yhis

List<String> fruitsListACopy = fruitsListA; 

副本你不要複製列表fruitsListA得到自動

修改。相反,您可以參考現有列表。因此,對「複製品」的所有修改都反映在原件上。

進行復印,再次調用構造函數:

List<String> fruitsListACopy = new ArrayList<String>(fruitsListA); 
+0

我該如何修改列表。正如我的問題所問,我需要在所有3種不同的情況下獲得元素? –

+0

@AlagammalP製作副本保護原始列表。確保您不要在原始列表上調用修改方法,只能在副本上調用。 – dasblinkenlight

0

創建新實例,而不是分配相同的對象到另一個對象引用。

例如,您可以替換:

List<String> fruitsListACopy = fruitsListA; 

通過

List<String> fruitsListACopy = new ArrayList<>(fruitsListA); 

如果你不希望在複製列表操作之間的副作用,你必須創建的新副本在每個操作之前的原始列表。

然後,您必須在複製列表上調用retainAll()removeAll(),併爲方法提供原始列表的參數。

下面是一個示例代碼來說明:

public static void main(String[] args) { 
    List<String> fruitsListA = new ArrayList<String>(); 
    fruitsListA.add("Apple"); 
    fruitsListA.add("Banana"); 
    fruitsListA.add("Grapes"); 

    List<String> fruitsListB = new ArrayList<String>(); 
    fruitsListB.add("Strawberry"); 
    fruitsListB.add("Cranberry"); 
    fruitsListB.add("Orange"); 
    fruitsListB.add("Apple"); 

    // copy for A 
    List<String> fruitsListACopy = new ArrayList<>(fruitsListA); 
    fruitsListACopy.retainAll(fruitsListB); 
    // handle the result of fruitsListACopy 
    System.out.println("fruitsListACopy="+fruitsListACopy); 

    // copy for B 
    List<String> fruitsListBCopy = new ArrayList<>(fruitsListB); 
    fruitsListBCopy.removeAll(fruitsListA); 
    // handle the result of fruitsListBCopy 
    System.out.println("fruitsListBCopy="+fruitsListBCopy); 

    // copy for A 
    fruitsListACopy = new ArrayList<>(fruitsListA); 
    fruitsListACopy.removeAll(fruitsListB); 
    // handle the result of fruitsListACopy 
    System.out.println("fruitsListACopy="+fruitsListACopy); 
} 

輸出:

fruitsListACopy = [蘋果]

fruitsListBCopy = [草莓,酸果蔓,橙]

fruitsListACopy = [香蕉,葡萄]