2012-02-01 2 views
0

전체 arraylist를 통하지 않고이 부울 T/F 검사를이 코드에 통합하려면 어떻게해야합니까?>?목록에있는 부울 값에 따라 2d 목록의 특정 행을 변경하는 방법

상황은 다음과 같습니다. 다음과 같이

arraylist<arraylist<Integer>> bigArray....elig arraylist<Boolean> 
elig.size() == bigArray.get(0).size(); 
bigArray is rectangular (i.e. no differing sizes of interior Lists 

내 코드는 다음과 같습니다

for(int j=0; j<(bigArr.size()); j++) { //lets assume this is ==10   
    for(int e=0; e<(ballotArr.get(0).size()); e++) { //assume == 5 
    if(elig.get(e) == false) {   
     for(int k=0; k<(ballotArr.get(0).size()); k++) { //==5 
      bigArr.get(j).set(k, big.get(j).get(k)-1); 
     } 
    } 
    } 
} 
명확하게 볼 수 있습니다

으로, 루프의 가장 내부 통해이 반복됩니다 10 시간 언제 == (예) 거짓 elig.get 및 빼기 모든 지표에서. 필요한 것을

는 일정한 값을 유지하는 elig.get (예)입니다 동안 (INT의 K) 프로세스 및 대한 다음 나중에

(적어도 나는이 해결책이라고 생각) 다음 값을 얻을 목표는 특정 열에서 1의 값을 갖는 모든 행에서 1을 빼는 것입니다.

도움/의견을 보내 주셔서 감사합니다.

답변

0

라이브러리 구현을 사용하면이 속도가 약간 빨라질 수 있습니다. 맞춤 컬렉션을 사용하면 일 수도 있고 일 수도 있습니다.하지만이 범위는 여기에서 벗어납니다. 은 특정 반복 제약 조건에 비해 최대이므로 모든 경우에 할 수있는 일은 많습니다.

이 작은 방법으로 절차를 중단하는 것이 도움이 될 것입니다 :

public static void decrementColumns(List<List<Integer>> rows, List<Boolean> mask) { 
    final List<Integer> maskIndicies = getMaskIndicies(mask); 
    // We're locked into this iteration because we have to modify every row. 
    for (List<Integer> row : rows) { 
     apply(maskIndicies, row); 
    } 
} 

// Your big savings will come from figuring out the indicies. 
// This allows us to make the iterations-per-row smaller - 
// assuming not every row (or even most) is set to 'true'! 
public static List<Integer> getMaskIndicies(List<Boolean> mask) { 
    final List<Integer> maskIndicies = new ArrayList<Integer>(mask.size()); 
    for (int i = 0; i < mask.size(); i++) { 
     if (mask.get(i)) { 
      maskIndicies.add(i); 
     } 
    } 
} 

public static void apply(List<Integer> maskIndicies, List<Integer> row) { 
    // We're locked into this iteration, needing to apply the transformation 
    // to every column included. 
    for (Integer index : maskIndicies) { 
     final Integer modified = row.get(index) - 1; 
     row.set(index, modified); 
    } 
} 

너무 조심,이 하지 스레드이므로주의 해주십시오. 나는 또한 ... 어떤 안전 점검에 쓰기, 그렇게하지 않았다


편집 : 다시 읽고 질문에, 나는 깨달았다시

내가 처음에 코드가 무엇을하고 있었는지 잘못 읽기 (그리고 나는 나 자신을 차고있다 - 어떻게 든 나는 루프를 떨어 뜨렸다).

수정 된 버전 :

public static void decrementColumns(List<List<Integer>> rows, List<Boolean> mask) { 
    final int count = getMaskCount(mask); 
    // We're locked into this iteration because we have to modify every row. 
    for (List<Integer> row : rows) { 
     apply(row, count); 
    } 
} 

public static void int getMaskCount(List<Boolean> mask) { 
    int count = 0; 
    for(Boolean flag : mask) { 
     if (!flag) { 
      count++; 
     } 
    } 
    return count; 
} 

public static void apply(List<Integer> row, int count) { 
    for (int index = 0; index < row.size(); index++) { 
     final Integer modified = row.get(index) - count; 
     row.set(index, modified); 
    } 
} 

여전히이 수행되지 않도록 유의하시기 바랍니다 ~ 꼭 ~ 원래 코드가 무엇을, 당신이 시도하는 경우에만 제가 있으리라 믿고있어, 주어진 당신의 '요구 사항'텍스트 우선, 적어도 추가 목록을 정의하십시오. 관계를 제공하지 않는 것이 좋습니다. 그 중 하나는 오타입니다. 명확하게 질문을 편집하면 더 나은 대답을 드릴 수 있습니다. 코드와 질문 텍스트 사이에 모호하거나 모순되는 점이 몇 가지 있습니다. 원래 코드가 O(m * (n^2))에서 실행되는 동안 최소 및 내 버전은 O(n + (m * n))에서 실행됩니다.

+0

내 방식대로하는 것에 대한 제안 사항 (즉, 약간 증가하지 않았습니까?) 나는이 논리를 정말로 떨어 뜨리고 싶다. –

관련 문제