2012-03-29 68 views
35

我想「合併」兩個arrayLists,產生一個新的arrayList,它包含兩個組合arrayLists中的所有數字,但沒有任何重複的元素他們應該是有序的。我在下面提出了這個代碼。我通過它運行它,這對我來說很有意義,但是我不確定我是否可以使用<或>來比較getL(i)在arrayLists中。我將array1中的所有元素添加到plusArray中。然後,我正在通過plusArray並將其與array2進行比較,以查看是否有任何array2的元素存在於plusArray中。如果他們這樣做,我什麼都不做,但如果他們不這樣做,我試圖將它添加到正確的位置。也許我的嵌套for循環被錯誤地使用?注意:ArrayLists按用戶按升序排序。將兩個arrayLists合併到一個新的arrayList中,沒有重複和按順序,在Java中

 ArrayList<Integer> plusArray = new ArrayList<Integer>(); 
for(int i = 0; i < array1.size(); i++){ 
    plusArray.add(array1.get(i)); 
} 

for(int i = 0; i < plusArray.size(); i++){ 
    for(int j = 0; j < array2.size(); j++){ 

    if(array2.get(j) < plusArray.get(i)){ 
     plusArray.add(i,array2.get(j)); 
    } 
    else if(plusArray.get(i).equals(array2.get(j))){ 
     ; 
    } 
    else if(array2.get(j) > plusArray.get(i)){ 
     plusArray.add(i, array2.get(j)); 
    } 

} 

更新:我沒有得到下面的異常。相反,它似乎程序永遠運行。我更改了在<和>條件中添加元素的位置。 /// 這裏是我得到的異常時,我的數組列表是: INTSET 1:{1 2} INTSET 2:{1 3 4}

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOf(Unknown Source) 
at java.util.Arrays.copyOf(Unknown Source) 
at java.util.ArrayList.grow(Unknown Source) 
at java.util.ArrayList.ensureCapacityInternal(Unknown Source) 
at java.util.ArrayList.add(Unknown Source) 
at IntSet.plus(IntSet.java:92) 
at IntSetDriver.main(IntSetDriver.java:61) 
+0

請發佈你得到的例外。 – 2012-03-29 01:02:28

回答

23

,而不是你寫的代碼,你可以使用ArrayList.addAll()合併列表,Collections.sort()對它進行排序,最後遍歷結果ArrayList中刪除重複的。綜合複雜度因此是O(n)+O(n*log(n))+O(n),相當於O(n*log(n))

+0

我認爲這個答案有點誤讀,因爲整個算法沒有完成O(n)。 排序可能需要O(nlogn)。此外,即使遍歷是O(n),從ArrayList刪除可能需要O(n),因爲它需要(最多)n個元素的副本。 – Kazuki 2014-03-31 08:41:18

4

也許我的嵌套的for循環是使用不正確?

提示:嵌套循環無法解決此問題。簡單的for循環也不起作用。

您需要可視化問題。

在一張紙上寫兩個有序列表,並用兩根手指指向各個列表的元素,在您進行頭部合併時逐步瀏覽它們。然後將你的心理決策過程轉化爲算法,然後編碼。

最佳解決方案使單個通過兩個列表。

+0

所以你說像一個while循環或做循環?不是那些相同的循環以不同的格式 – Milwaukoholic 2012-03-29 01:05:07

+0

好吧...也許生病看明天再次,事情會更清楚。 – Milwaukoholic 2012-03-29 01:28:03

+0

還有其他提示嗎?我一直回到我原來的解決方案,我認爲會工作 – Milwaukoholic 2012-03-29 17:28:46

2

您的循環第二要有J ++而不是我++

+0

我修復它,並把新的例外 – Milwaukoholic 2012-03-29 01:13:40

2

我不確定爲什麼你當前的代碼失敗(你得到了什麼樣的異常?),但我想指出這種方法執行O(N平方)。考慮預排序的輸入陣列(如果它們沒有被定義被預排序)和合並排序的數組:

http://www.algolist.net/Algorithms/Merge/Sorted_arrays

排序通常爲O(N logN)的和合並是O(M + N)。

+0

林不知道我是否應該使用這種方法,因爲我還沒有在課堂上學到這一點。我猜這不會受傷嗎? – Milwaukoholic 2012-03-29 01:12:22

+0

如果教師已經教授了一種特定的方法,那麼您可能希望至少實施他所展示的內容。不過,熟悉big-O的概念和不同算法的相對性能是非常重要的。如果你有時間,也應該實施這種方法,並比較相當大的輸入性能。 – 2012-03-29 01:19:19

+0

他沒有真正教會我們如何做到這一點。他們只是教我們代碼,我們必須實現我們所知道的才能完成它。 Idk – Milwaukoholic 2012-03-29 18:19:51

1

您的嵌套for循環

for(int j = 0; j < array2.size(); i++){ 

是無限的爲J總是等於零,在另一方面,我將在將在這個循環上升。當我大於plusArray.size()時,您將得到OutOfBoundaryException

+0

是的,我解決了這個問題,並把新的例外 – Milwaukoholic 2012-03-29 01:17:42

+0

ArrayList.add(x)在列表的末尾添加x,所以你沒有排序ArrayList,但你的循環需要加上陣列排序,對不對? – Southeast 2012-03-29 01:30:09

+0

Java API Collections和ArrayList:http://docs.oracle.com/javase/1.5.0/docs/api/ – Southeast 2012-03-29 01:34:12

11

添加ArrayList1,ArrayList2並生成單個ArrayList3 ArrayList3。 現在把它轉換成

Set Unique_set = new HashSet(Arraylist3); 

在組唯一的你會得到獨特的元素。
注意

的ArrayList允許重複值。 Set不允許重複的值。 希望你的問題解決。

+0

我沒有學過HashSets或addAll()或O()的東西... – Milwaukoholic 2012-03-29 18:19:07

+0

嘗試學習Java集合它將解決您的大部分需求。 – special 2012-04-04 10:11:47

56

首先刪除重複:

arrayList1.removeAll(arrayList2); 

然後合併兩個數組列表:

arrayList1.addAll(arrayList2); 

最後,你的排序,如果你想的ArrayList:

collections.sort(arrayList1); 

如果你不想要對現有列表進行任何更改,請先創建其備份列表:

arrayList1Backup = new ArrayList(arrayList1); 
+0

如果有人發現這不起作用,請注意,列表中的對象應該重寫equals方法,以使其工作,因爲 - > http://stackoverflow.com/a/35960394/441902 – cherit 2017-01-03 21:30:49

10
List<String> listA = new ArrayList<String>(); 

    listA.add("A"); 
    listA.add("B"); 

List<String> listB = new ArrayList<String>(); 

    listB.add("B"); 
    listB.add("C"); 

Set<String> newSet = new HashSet<String>(listA); 

    newSet.addAll(listB); 
List<String> newList = new ArrayList<String>(newSet); 

System.out.println("New List :"+newList); 

是給你 新的列表:[A,B,C]

3

添加元素在第一數組列表

ArrayList<String> firstArrayList = new ArrayList<String>(); 

firstArrayList.add("A"); 
firstArrayList.add("B"); 
firstArrayList.add("C"); 
firstArrayList.add("D"); 
firstArrayList.add("E"); 

添加元素在第二數組列表

ArrayList<String> secondArrayList = new ArrayList<String>(); 

secondArrayList.add("B"); 
secondArrayList.add("D"); 
secondArrayList.add("F"); 
secondArrayList.add("G"); 

添加第一個ArrayList中的元素排在第二的ArrayList

secondArrayList.addAll(firstArrayList); 

分配新組合ArrayList和從兩個的ArrayList添加的所有元素

ArrayList<String> comboArrayList = new ArrayList<String>(firstArrayList); 
comboArrayList.addAll(secondArrayList); 

分配新集從刪除重複項ArrayList的

Set<String> setList = new LinkedHashSet<String>(comboArrayList); 
comboArrayList.clear(); 
comboArrayList.addAll(setList); 

排序的ArrayList

Collections.sort(comboArrayList); 

輸出

A 
B 
C 
D 
E 
F 
G 
-1

您不必handcode這一點。問題的定義恰恰是Apache Commons CollectionUtils#collate的行爲。它也被重載用於不同的排序和允許重複。

+0

也許這應該是一個評論,而不是一個答案... – jpganz18 2015-11-06 15:38:15

+0

最上面的答案與此完全相同:「不要自己寫,這裏是可以爲你做的對象。」我編輯了我的措辭。 – Noumenon 2015-11-07 03:43:56

0
**Add elements in Final arraylist,** 
**This will Help you sure** 

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

public class NonDuplicateList { 

public static void main(String[] args) { 

    List<String> l1 = new ArrayList<String>(); 
    l1.add("1");l1.add("2");l1.add("3");l1.add("4");l1.add("5");l1.add("6"); 
    List<String> l2 = new ArrayList<String>(); 
    l2.add("1");l2.add("7");l2.add("8");l2.add("9");l2.add("10");l2.add("3"); 
    List<String> l3 = new ArrayList<String>(); 
    l3.addAll(l1); 
    l3.addAll(l2); 
    for (int i = 0; i < l3.size(); i++) { 
     for (int j=i+1; j < l3.size(); j++) { 
      if(l3.get(i) == l3.get(j)) { 
       l3.remove(j); 
      } 
     } 
    } 
    System.out.println(l3); 
} 

}

輸出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

+0

不要只是轉儲代碼。請注意解釋此解決方案的工作原理。 – user2004685 2016-02-07 10:51:10

3

的Java 8 Stream API可以用來爲宗旨,

ArrayList<String> list1 = new ArrayList<>(); 

list1.add("A"); 
list1.add("B"); 
list1.add("A"); 
list1.add("D"); 
list1.add("G"); 

ArrayList<String> list2 = new ArrayList<>(); 

list2.add("B"); 
list2.add("D"); 
list2.add("E"); 
list2.add("G"); 

List<String> noDup = Stream.concat(list1.stream(), list2.stream()) 
        .distinct() 
        .collect(Collectors.toList()); 
noDup.forEach(System.out::println); 

順便,它不應該是忘詞使distinct()使用hashCode()

0

我明白了你不想使用內置函數合併或從ArrayList中刪除重複項。 您的第一個代碼會永久運行,因爲外部for循環條件是'Always True'。 由於您正在向plusArray添加元素,所以plusArray的大小隨着每次添加而增加,因此'i'總是小於它。因此,條件永遠不會失敗,程序將永遠運行。 提示:嘗試先合併列表,然後從合併列表中刪除重複的元素。 :)

相關問題