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


257

두 개의 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"};

답변:


585

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

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

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


121

단일 배열 또는 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);

10
이것이 Java 객체 지향 솔루션입니다. 아마도, 어떻게해야하는지 ... :)
Evan

22

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

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

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


11

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

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

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


5

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

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

4

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


3

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


2

"자동"의 의미를 완전히 모르는 경우-두 객체를 모두 보유하는 컨테이너 객체를 만들 수 있습니다.

공개 클래스 FileImageHolder {문자열 fileName; 문자열 이미지 이름; // TODO : 여기에 내용 삽입}

그리고 그것을 배열 목록에 넣고 그 배열 목록을 무작위로 만드십시오.

그렇지 않으면 각 요소가 한 목록에서 어디로 이동했는지 추적하고 다른 요소로 이동해야합니다.


2

뒤섞인 후 요소의 오래된 색인을 검색하는 방법이 없다면 두 가지 방법 중 하나를 수행합니다.

A) 다른리스트 multi_shuffler = [0, 1, 2, ..., file.size ()]를 만들어 섞습니다. 순서대로 반복하여 섞은 파일 / 이미지 목록을 주문하십시오.

ArrayList newFileList = 새로운 ArrayList (); ArrayList newImgList = 새로운 ArrayList (); (i = 0; 나는

또는 B) 파일 / 이미지 이름을 보유하도록 StringWrapper 클래스를 만들고 이미 가지고있는 두 목록을 결합하십시오. ArrayList CombineList;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.