2017-12-27 15 views
-1

우리가 알고있는 것처럼 ArrayList 셔플 링은 Collections.shuffle 메서드로 수행 할 수 있습니다.shuffle 다차원 List, ArrayList, LinkedList

그러나 어떻게 다차원 순차 수집과 함께 작동합니까?

다음과 같이 나는 패턴이있는 경우 :

1,2,3 
4,5,6 
7,8,9 

나는 이런 식으로 뭔가 달성하고자 :

1,5,7 
2,3,8 
9,4,6 

Collection.shuffle를 (단지 행이나 열 중 하나를 교환합니다,하지만 난 할) 모든 요소를 ​​완전히 독립 시키십시오.

나는 NOT WANT : 그냥 다차원 목록에 Collection.shuffle를 호출 할 경우

1,3,2 
5,6,4 
7,9,8 
+0

어떤 결과가 예상됩니까? – bcsb1001

+0

모든 요소가 무작위로 셔플하게되는 arraylist –

+0

나는 적응 한 질문을위한 해결책으로 나의 대답을 확장했다. – Ward

답변

1

는, 그 목록 안에 하위 목록의 순서를 셔플한다.

대신 모든 하위 목록을 임의로 이동하려면 각 하위 목록에 Collection.shuffle (으)로 전화해야합니다.

요구 사항은 모든 하위 목록의 모든 요소를 ​​섞고도 충분하지 않을 것입니다 위의 코드, 하위 목록 사이의 요소를 섞어 정말 인 경우 편집 된 질문 후

final List<List<String>> list = Arrays.asList(
     Arrays.asList("A", "B", "C"), 
     Arrays.asList("X", "Y", "Z"), 
     Arrays.asList("1", "2", "3") 

); 

// 1. Will shuffle the order of the sub-lists 
Collections.shuffle(list); 

// 2.a. Will shuffle all the sub-lists 
list.forEach(sublist -> Collections.shuffle(sublist)); 

// 2.b. Or the same, with method reference instead of lambda 
list.forEach(Collections::shuffle); 

편집. 당신이 요청으로

아래의 코드는 할 것이다, 그러나 (이 경우 3에) 모든 하위 목록이 같은 크기이 있다고 가정합니다 :

// 1. Add all values in single dimension list  
List<String> allValues = list.stream() 
     .flatMap(List::stream) 
     .collect(toList()); 

// 2. Shuffle all those values 
Collections.shuffle(allValues); 

// 3. Re-create the multidimensional List 
List<List<String>> shuffledValues = new ArrayList<>(); 
for (int i = 0; i < allValues.size(); i = i + 3) { 
    shuffledValues.add(allValues.subList(i, i+3)); 
} 

+0

셔플 하위 목록과 셔플 요소를 각 하위 목록에서 수행하여 모든 요소가 completepy 새 순서를 얻길 원합니다. –

+0

좋아요, 위의 코드를 게시하면 정확하게 처리됩니다. – Ward

+0

지금 고맙습니다. 내가 원하는 것을하는 것처럼 보입니다. –

0

당신이 깊은 셔플을하고 싶은 경우에, 나는 목록의 각 항목이 다른 목록인지 여부를 검사하고 해당 목록을 재귀 적으로 뒤섞는 방식을 권장합니다. 이런 식으로 뭔가가 :

public static void deepShuffle(List<?> mutliDimensionList) { 
    for (Object item : mutliDimensionList) { 
     if (item instanceof List) { 
      deepShuffle((List<?>)item); 
     } 
    } 
    Collections.shuffle(mutliDimensionList); 
} 

당신은 잠재적으로 ForkJoinPool 또는 비슷한 성능을 향상시키기 위해 멀티 스레딩을 추가 할 수 있습니다. 그것은 전적으로 당신의 유스 케이스에 의존합니다.

편집이 답변은 편집 된 질문에 더 이상 적용되지 않습니다. 그러나 개별 하위 목록을 독립적으로 셔플해야 할 때 작동해야합니다.

관련 문제