2017-03-25 4 views
0

data이라는 다른 ArrayList의 인덱스를 포함하는 ind이라는 Java에서 ArrayList이 있습니다. 내가 원하는 것은 ind의 각 항목을 다음 다음 항목과 비교하여 그 차이가 숫자, mpd보다 낮은 지 확인하는 것입니다. 차이가 더 큰 경우 다음 항목으로 이동하십시오. 낮은 경우 data.get(index)이 가장 낮은 인덱스를 삭제하십시오. 기본적으로, 나는 최고봉을 찾으려고 노력합니다. 나는 그것이 목록에서 항목을 제거하는 가장 좋은 방법이 아니다 알고ArrayList의 뺄셈

for(int i = 0; i<ind.size()-1; i++) { 
     if (ind.get(i) != -1) { 
      for (int j = i + 1; j < ind.size(); j++) { 
       if ((ind.get(j) - ind.get(i)) <= mpd) { 
        if (x.get(ind.get(i)) >= x.get(ind.get(j))) { 
         ind.set(j, -1); 
        } else { 
         ind.set(i, -1); 
         break; 
        } 
       } else { 
        break; 
       } 
      } 
     } 
    } 
ind.removeAll(Collections.singleton(-1)); 

, 그러나 이것은 처음에 일을했다 :

내 첫 번째 방법이 있었다.

그러나 나는 이것을 수행하는 훨씬 더 좋은 방법이 있어야한다는 것을 알고 있습니다. 이 범위를 벗어났습니다 마지막 비교를 위해, 물론 대단한

ind.removeIf(indices -> ((ind.get(indices+1) - ind.get(indices)) <= mpd)); 

을하지만 : 그래서 어떤 시련을 수행 한 후,이에 도착. 그리고 그것은 내가 의미하지 않는 다른 목록의 항목 목록에서의 succesors, 그 후 자신의 가치를 비교할 수있는 방법이 있나요

(x.get(ind) vs x.get(ind+1))

가장 높은 요소를 삭제 비교를하지 않습니다 루프를위한 이중? 미리 감사드립니다.

편집 :

어떤 생각을하고 후에, 나는이 지수는 공업의 값을 포함하고 있기 때문에이 가능 확실하지 않다, 그래서 indices+1을 할 경우 단지 하나를 추가 할 수 있지만 다음 값을받지 않습니다 , 그리고 당신은 정말에만 반복되는 현재 인덱스를 제거 할 수로 removeIf을 사용할 수 없습니다

ind.removeIf(indices -> (indices + 1 < ind.size() && (ind.get(indices) - ind.get(indices + 1)) <= mpd)); 

+0

가장자리를 벗어나지 않도록 한 요소를 일찍 정지시킬 수는 없습니까? –

+0

끝에 색인을 찾았습니까? 찾았습니까? 나는 그들이 다른 결과로 끝날지도 모른다라고 생각한다. –

+0

당신은 현재의 인디안을 현재의 인디안과 비교하려고한다고하지만, 당신의 코드는 현재의 인디안을 그 이후의 모든 인디와 비교하고 있습니다. 귀하의 질문이 끝나면, 당신은 최고봉을 찾고 있다고 말합니다. 나는 그 문제를 완전히 이해하지 못하고있다. –

답변

0

당신은 당신이 경계 여전히 있음을 확인할 수 있습니다) (indices.next 할 수 없다 on으로 설정하고 다른 모든 노드와 비교해야합니다 (원래 코드에서 비교하면 현재 노드 또는 비교 대상 노드를 제거 할 수 있음). 이와 같은 이유로 ListIterator도 도움이되지 않습니다. 그러나 내부 for 루프를 제거 할 수 있습니다.

Integer lastInd = null; 
    Integer lastData = null; 
    for(int i = 0; i<ind.size(); i++) { 
     // New peak value with no removal 
     if (i == 0 || ind.get(i) - lastData > mpd) { 
      lastInd = i; 
      lastData = ind.get(i); 
      continue; 
     } 
     // Remove the lower value, if lower value was lastData switch to 
     // make this value the new lastData for comparison 
     if (x.get(lastData) >= x.get(ind.get(i))) { 
      ind.set(i, -1); 
     } else { 
      ind.set(lastInd, -1); 
      lastInd = i; 
      lastData = ind.get(i); 
     } 
    } 
    ind.removeAll(Collections.singleton(-1)); 
+0

그것은 내가 생각조차하지 못했던 훌륭한 생각이다 ... 빠른 비교가 가능한지 어떤 생각이든. 시도해 보았습니다 'ind.removeIf (indices -> (indices + 1 Hamperfait

+0

당신이하고있는 일을 이해하는 것이 유용 할 수도 있습니다. 아마 어떤 데이터를 가지고있을 것입니다. 코드의 x는 설명에서 데이터로 참조하는 것이라고 가정하고 있습니다. mpd = 3, ind = [3,6,5,1,7,2,4] 및 data = [6,9,2,8,1,3,5]이면 원래 코드의 결과는 [2,6] 나는 믿습니다 (mpd 확인으로 인해 9의 가장 높은 값이 손실됩니다). 그것이 당신이 찾고있는 결과입니까? –

+0

죄송합니다. 더 구체적이어야합니다. 원래 코드의 결과는 각각 2와 6 인 데이터를 가리키는 ind = [3,1]입니다. –