[java] 동일한 방식으로 두 ArrayList를 무작위로 추출하는 방법은 무엇입니까?

두 개의 arraylist가 filelist있고 imgList서로 관련되어 있습니다 (예 : “e1.jpg”와 관련된 “H1.txt”). imgList의 무작위 화에 따라 목록을 자동으로 무작위 화하는 방법 은 fileList무엇입니까? Excel에서와 같이 특정 열을 정렬하면 다른 열이 자동으로 따라갑니다?

String [] file = {"H1.txt","H2.txt","H3.txt","M4.txt","M5.txt","M6.txt"};
ArrayList<String> fileList = new ArrayList<String>(Arrays.asList(file));

String [] img = {"e1.jpg","e2.jpg","e3.jpg","e4.jpg","e5.jpg","e6.jpg"};
ArrayList<String> imgList = new ArrayList<String>(Arrays.asList(img));

//randomized files
Collections.shuffle(fileList);

무작위 화 후 출력 예 :

fileList = {"M4.txt","M6.txt","H3.txt","M5.txt","H2.txt","H1.txt"};

의도 된 출력 :

 imgList = {"e4.jpg","e6.jpg","e3.jpg","e5.jpg","e2.jpg","e1.jpg"};



답변

동일한 시드 Collections.shuffle()로 두 Random객체가 초기화 된 상태에서 두 번 사용하십시오 .

long seed = System.nanoTime();
Collections.shuffle(fileList, new Random(seed));
Collections.shuffle(imgList, new Random(seed));

Random시드가 같은 두 객체를 사용하면 두 목록이 정확히 같은 방식으로 섞입니다. 이를 통해 두 개의 개별 컬렉션이 가능합니다.


답변

단일 배열 또는 List해당 객체로 끝날 수 있도록 다른 클래스로 래핑하십시오 .

public class Data {
    private String txtFileName;
    private String imgFileName;

    // Add/generate c'tor, getter/setter, equals, hashCode and other boilerplate.
}

사용 예 :

List<Data> list = new ArrayList<Data>();
list.add(new Data("H1.txt", "e1.jpg"));
list.add(new Data("H2.txt", "e2.jpg"));
// ...

Collections.shuffle(list);


답변

가장 간단한 방법은 두 값을 이미지와 파일이 모두 포함 된 유형으로 캡슐화하는 것입니다. 그런 다음 구축 ArrayList그것을 하고 셔플.

캡슐화도 향상되어 이미지와 항상 같은 수의 파일을 자동으로 가질 수있는 속성을 제공합니다.

당신이 경우 대안 정말 그 생각이 마음에 들지는 (이 수정의 많은 예이다 셔플 코드를 직접 작성하는 것입니다 피셔 – 예이츠 셔플 의심 스택 오버플로 I에 대한 몇 가지를 포함하여, 자바)과에서 두 목록에서 작동 단지 동시. 그러나 나는 “개선 캡슐화”접근 방식을 사용하는 것이 좋습니다.


답변

지도를 사용하여이 작업을 수행 할 수 있습니다.

Map<String, String> fileToImg:
List<String> fileList = new ArrayList(fileToImg.keySet());
Collections.shuffle(fileList);
for(String item: fileList) {
    fileToImf.get(item);
}

이것은 무작위 순서로 이미지를 반복합니다.


답변

셔플 방법을 사용하여 수행 할 수 있습니다.

private List<Integer> getJumbledList() {
     List<Integer> myArrayList2 = new ArrayList<Integer>();
        myArrayList2.add(8);
        myArrayList2.add(4);
        myArrayList2.add(9);
        Collections.shuffle(myArrayList2);
        return myArrayList2;


답변

두 개의 문자열 배열 대신 두 개의 문자열을 포함하는 사용자 정의 클래스의 배열 하나를 갖습니다.


답변

0에서 5까지의 숫자를 포함하는 배열을 만들어 섞을 수 있습니다. 그런 다음 결과를 “oldIndex-> ​​newIndex”의 맵핑으로 사용하고이 맵핑을 두 원래 배열에 적용하십시오.