2017-03-22 14 views
0

세 명의 arraylists가 있습니다. 2 개는 캔버스상의 점에 대한 좌표를 보유합니다 (xCoord, yCoord). 이것은 dot to dot 프로그램입니다. 세 번째 arraylist는 가장 낮은 "손상"또는 결과 그림의 손상으로 캔버스에서 제거 할 수있는 점을 계산하는 코드를 보유합니다. 이는 "임계 값"을 반환하는 간단한 알고리즘을 기반으로합니다. 임계 값이 작은 점은 임계 값이 높은 점보다 화상이 흐려집니다.다른 ArrayList를 기반으로 ArrayList의 요소를 제거하십시오.

제 문제는 가장 작은 임계 값을 기준으로 x 및 y arraylists에서 n 개의 점을 제거하는 것입니다. 이미 구현 된 사용자 입력 코드가 있습니다.

public void removeDots(int numberDesired){ 
    int i = 0; 

    for (i =0; i<numberDesired; i++){ 

     xCoord.remove(critDots.get(i); //No idea, just trying random things. 
     yCoord.remove(critDots.get(i); 

    } 
} 


    for (i = 0; i < xCoord.size()-1; i++) { 
      critValue = Algorithm Calculations 
      critDots.add(critValue); 
     } 

가 나는 적어도에서 중요한 가장 중요한로 구성 할

Collections.sort(critDots) 

를 사용하여 생각,하지만 난이 내 xCoord/yCoord의 순서에 영향을 미치는 방법의 확실 해요했습니다.

내가 올바른 방향으로 나아가는 데 도움이되는 몇 가지 팁이 인정 될 것입니다. 또한 xCoord, yCoord 및 critDots는 모두 arraylists입니다.

class Dot { 
    private final int x; 
    private final int y; 

    // hashValue and equals methods 
} 

스토어 목록의 캔버스에 점의 목록 :

List<Dot> dots; 

이 가능성이 훨씬 더 좋을

+0

'제 3의 arraylist는 도트를 캔버스에서 제거 할 수있는 코드를 계산할 수있는 코드를 보유하고 있습니다.'도트는 제거 할 x 좌표와 y 좌표의 쌍을 의미합니까? –

+0

예입니다. – Fed148

+1

코드의 일부를 설명하는 대신 전체 [mcve]를 제공하십시오. 질문은 예를 들어 어떤 목록에 어떤 종류의 물건을 보관하고 있습니까? 아마 추측 하듯이 실수로 (또는 반대 방향으로) 메소드를 제거 (색인)하는 대신 remove (객체)를 호출 할 수 있습니다. Integer 객체에 int 값을 자동으로 복싱 (boxing)하기 때문에 이러한 현상이 발생할 수 있습니다. 사실, 그럴 가능성이 가장 높습니다. – GhostCat

답변

0

은 별도의 Dot 클래스에서 x와 y 값을 넣어 모델을 별도의 목록에 x 및 y 좌표를 저장하는 것보다 좋습니다. 또한 모델을 변경하지 않고 도트 (예 : 색상)에 속성을 추가 할 수 있으므로 더 나은 OO 디자인입니다. 당신이 스트림에 익숙하지 않은 경우 나 댓글에 알려

List<Dot> toRemove = dots.stream() 
    .sort(comparingInt(d -> calculateDamageForDot(d))) 
    .limit(numberToRemove) 
    .collect(toList()); 

나는 옛날 스타일의 반복을 제공합니다 :

가장 작은 손상을 일으키는 원인이되는 점을 얻을 수 있도록 '손상'알고리즘을 사용하여 그것은 동등한 일을합니다.

그리고, 마지막으로, 가장 작은 손상 점 제거 :

dots.removeAll(toRemove); 
+0

고맙습니다. Dot 클래스를 만드는 것은 의미가 있습니다. – Fed148

0

당신이 dot에 의해 당신이 xy 좌표의 쌍을 의미하는 것으로 말했듯이 ArrayList에서 그들을 제거하는 동안, 당신은 둘 다 필요를 . xy 좌표의 쌍을 찾아 제거하십시오.

주문을 보존해야하기 때문에 두 가지를 모두 제거해야합니다.

public void removeDots(int x, int y){ 
    //find that pair 
    for(i=0; i<xCoord.size(); i++) { 
     if(xCoord.get(i) == x && yCoord.get(i) == y) { 
      xCoord.remove(i); 
      yCoord.remove(i); 
      break; //don't remove this break if there are duplicate co-ordinates in your lists. 
     } 
    } 
} 

이제 단순히 위의 메서드를 호출하고 제거 :

... 
removeDots(3, 5); 
... 

그러나, 대신에이 같은 두 arraylists 관리의 당신의 "점"에 대한 사용자 정의 데이터 유형을 작성하는 것이 좋습니다 것입니다.

관련 문제