2016-11-27 4 views
1

그래서 내가하려는 것은 Array 클래스의 일부 메서드를 일반 Array에서 ArrayList로 변환하는 것입니다. 그러나 나는 두 가지 뚜렷한 문제를 겪었다. 첫째로, ArrayList의 순서를 뒤집어 쓰는 동안 이상하게도 6 개의 정수가 있으면 역순으로 처리하려고합니다. 처음 3 개의 인덱스 위치와 실제 정수를 출력합니다. 마지막으로 3. 예를 들면 다음과 같이 출력됩니다 : 역순 : 5, 4, 3, 96, 87, 24, 순서 : false. 내가 인쇄하고자하는 것은 941, 874, 102, 96, 87, 24입니다. 순서는 틀립니다. 내 두 배열 목록의 병합에 관해서는,이 코드 줄을 ArrayList를 인쇄하는 방법으로 변환하는 방법을 잘 모르기 때문에 올바르게 병합 할 지 확신 할 수 없습니다. 원래 병합 된 배열을 출력하기 위해이 두 줄의 코드를 사용했습니다.ArrayList의 순서를 바꾸고 두 개의 ArrayList를 병합

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

여기서 I는의 ArrayList를 반대로 이용하고있는 방법과 병합하는 방법은 두 가지이다 : public static void reverse(ArrayList <Integer> a)에서

/***  <<< 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

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

관련 문제