2016-11-27 67 views
1

所以我想要做的是將我的Array類中的一些方法從常規數組轉換爲ArrayList。但是,我遇到了兩個不同的問題。首先,在顛倒ArrayList的順序的同時,我注意到奇怪的是它打印出來,如果我有6個整數,並且我正在嘗試反轉,它會打印出前3個索引位置以及實際的整數最後3.例如它會打印出來:倒序:5,4,3,96,87,24,順序:假。我想要它打印出來的是941,874,102,96,87,24,依次爲:錯誤。關於我的兩個數組列表的合併,我不確定它是否會正確合併,因爲我不知道如何轉換此行代碼以打印出ArrayList。我用這兩行代碼最初打印出我的合併數組。顛倒ArrayList的順序併合並兩個ArrayLists

int merged[] = merge(num3,num4); 
print(merged); 

下面是我使用的扭轉ArrayList中的方法和合並方法之二:

/***  <<< CODE NOT COMPLETE >>> 
    * reverses the order of the elemets in the array 
    ***/ 
    public static void reverse(ArrayList <Integer> a) 
    { 
     for (int i = 0; i < a.size()/2; i++) 
     { 
      int reverseOrder = a.get(i); 
      a.set(i, a.size() - 1 - i); 
      a.set(a.size() - 1 - i, reverseOrder); 
     } 
    } 

    /***  <<< CODE NOT COMPLETE >>> 
    * merges two sorted arrays into 1 new array, maintains the sorted order 
    ***/ 
    public static ArrayList <Integer> merge (ArrayList <Integer> a, ArrayList <Integer> b) 
    { 
     ArrayList <Integer> merge = new ArrayList <Integer> (a.size() + b.size()); 
     int i = 0, j = 0, k = 0; 

     while (i < a.size() && j < b.size()) 
     { 
      if (a.get(i) < b.get(j)) 
      { 
       merge.set(k++, a.get(i++)); 
      } 

      else   
      { 
       merge.set(k++, b.get(j++)); 
      } 
     } 

     while (i < a.size()) 
     { 
      merge.set(k++, a.get(i++)); 
     } 

     while (j < b.size()) 
     { 
      merge.set(k++, b.get(i++)); 
     } 

     return merge; 
    } 

回答

1

public static void reverse(ArrayList <Integer> a),這

a.set(i, a.size() - 1 - i); // <-- the index, not the value. 
a.set(a.size() - 1 - i, reverseOrder); 

應該

a.set(i, a.get(a.size() - 1 - i)); // <-- the value. 
a.set(a.size() - 1 - i, reverseOrder); 

您好所以請在merge中輸入錯字,在最後一個循環中使用i++。但實際上,您應該更喜歡List界面。此外,由於List保留了內部索引,因此不需要k。你也不需要明確地確定你的List的大小(但我在這裏與你的代碼一致)。而且,我會存儲size(s)。贊,

public static List<Integer> merge(List<Integer> a, List<Integer> b) { 
    final int aLen = a.size(), bLen = b.size(); 
    List<Integer> al = new ArrayList<>(aLen + bLen); 
    int i = 0, j = 0; 
    while (i < aLen && j < bLen) { 
     if (a.get(i) < b.get(j)) { 
      al.add(a.get(i++)); 
     } else { 
      al.add(b.get(j++)); 
     } 
    } 
    while (i < aLen) { 
     al.add(a.get(i++)); 
    } 
    while (j < b.size()) { 
     al.add(b.get(j++)); 
    } 
    return al; 
} 
+0

謝謝。這工作。現在,我將如何更改我的主要應該打印我的兩個合併方法的代碼行? – CrypticZero

+0

'ArrayList merged = merge(num3,num4);' –

+0

謝謝,我以爲我曾嘗試過,但我猜我輸入錯誤。這讓我編譯它,但當我試圖運行它時,我得到了一個indexOutOfBoundsException錯誤。它突出了merge.set(k ++,a.get(i ++)); 在我的合併方法。 – CrypticZero