2016-11-27 63 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