2015-01-04 2 views
-1

두 클래스 MainObject이 있습니다. 해당 값에 따라 오름차순으로 배열의 객체를 정렬해야합니다. compareTo에서 -1, 1, 0을 반환하고 그에 따라 for 루프를 실행하여 배열을 정렬해야합니다. Arrays.sort를 사용하고 싶지 않습니다. 수동으로해야합니다. Main 클래스의 정렬 부분이 작동하지 않습니다. 어떤 도움이 유용 할 수 있습니다. 고맙습니다.Java compareTo 배열 정렬

public class Main { 

public static void main(String[] args) { 

    Object[] arr = new Object[6]; 

    arr[0] = new Object(2); 
    arr[1] = new Object(5); 
    arr[2] = new Object(3); 
    arr[3] = new Object(1); 
    arr[4] = new Object(6); 
    arr[5] = new Object(4); 

    System.out.println("List of instances"); 
    for (int i = 0; i < 5; i++) { 
     System.out.println(arr[i].getValue()); 
    } 

    System.out.println(); 

    Object tempVar; 

    for (int i = 0; i < arr.length; i++) { 

     for (int j = 0; j < 5; j++) { 

      int result = arr[i].compareTo(arr[i]); 

      if (result == -1) { 
       tempVar = arr[j + 1]; 
       arr[j + 1] = arr[i]; 
       arr[i] = tempVar; 
      } 
     } 
    } 

    System.out.println("List of sorted instances"); 
    for (int i = 0; i < arr.length; i++) { 
     System.out.println(arr[i].getValue()); 
    } 

} 

}

public class Object implements Comparable<Object> { 

private int value; 

public Object(int value) { 
    this.value = value; 
} 

public int getValue() { 
    return value; 
} 

public void setValue(int value) { 
    this.value = value; 
} 

@Override 
public int compareTo(Object o) { 
    int result = 0; 

    if (this.value > o.getValue()) { 
     result = 1; 
    } else if (this.value < o.getValue()) { 
     result = -1; 
    } else if (this.value == o.getValue()) { 
     result = 0; 
    } 

    return result; 
} 

}

+9

클래스 '객체'의 이름을 지정하는 것은 매우 나쁜 생각입니다 ... – August

+1

'int result = arr [i] .compareTo (arr [i]);' .... 그 라인은 항상 0을 반환 못해? 당신은 배열의 동일한 색인을 비교하고 있습니까 –

+0

그 숙제입니까? 'Object' 클래스는 이미 자바로 구현되어 있습니다 :'Integer'를 체크하십시오 – Matthieu

답변

0

당신이 컬렉션의 모든 요소, 다음 여기에 5 같은 고정 값으로 사용하지 않는 을 통해 루프를 원하는 경우

System.out.println("List of instances"); 
for (int i = 0; i < 5; i++) { 

대신 arr.length을 사용하십시오. 배열 길이가 6이며 마지막 인덱스 전에 종료하려면 때문에,

for (int j = 0; j < 5; j++) { 

5 잘 될 수도 있지만 더 큰 배열을 사용하는 경우이 코드가 중단됩니다

이것은 또한이 라인에 적용 . 5 대신 arr.length - 1을 사용하십시오.


이 라인 자체 배열 요소를 비교한다

int result = arr[i].compareTo(arr[i]); 

따라서 result 항상 0 될 것이다. 중 하나에 변경 :

int result = arr[i].compareTo(arr[j]); 

또는 :

int result = arr[j].compareTo(arr[i]); 

그들 사이의 차이를보기 위해 두 가지 접근 방식을 사용해보십시오. 위의 수정에서


, 당신은 인덱스 ij의 요소를 비교하고 있습니다.

if (result == -1) { 
    tempVar = arr[j + 1]; 
    arr[j + 1] = arr[i]; 
    arr[i] = tempVar; 
} 

j의 올바른 인덱스를 사용하기 : 따라서이 코드를 변경해야

if (result == -1) { 
    tempVar = arr[j]; 
    arr[j] = arr[i]; 
    arr[i] = tempVar; 
} 

현재 코드가 잘되지 j 인해 버그 ij의 요소를 (비교를하지만, 당신은 그것을 의미했습니다), 다른 인덱스 j+1으로 인해 서로 다른 요소를 교환 할 수 있습니다.