동일한 방식으로 두 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"의 맵핑으로 사용하고이 맵핑을 두 원래 배열에 적용하십시오.
"자동으로"의 의미를 완전히 모르는 경우 두 객체를 모두 보유하는 컨테이너 객체를 만들 수 있습니다.
공개 클래스 FileImageHolder {문자열 fileName; 문자열 이미지 이름; // TODO : 여기에 내용 삽입}
그런 다음 배열 목록에 넣고 해당 배열 목록을 무작위로 지정하십시오.
그렇지 않으면 각 요소가 한 목록에서 어디로 이동했는지 추적하고 다른 요소로 이동해야합니다.
뒤섞인 후 요소의 오래된 색인을 검색하는 방법이 없다면 두 가지 방법 중 하나를 수행합니다.
A) 다른리스트 multi_shuffler = [0, 1, 2, ..., file.size ()]를 만들어 섞습니다. 순서대로 반복하여 섞은 파일 / 이미지 목록을 주문하십시오.
ArrayList newFileList = 새로운 ArrayList (); ArrayList newImgList = 새로운 ArrayList (); (i = 0; 나는
또는 B) 파일 / 이미지 이름을 보유하도록 StringWrapper 클래스를 만들고 이미 가지고있는 두 목록을 결합하십시오. ArrayList CombineList;
참고 URL : https://stackoverflow.com/questions/4228975/how-to-randomize-two-arraylists-in-the-same-fashion
'IT' 카테고리의 다른 글
MemoryStream을 파일에 저장 및로드 (0) | 2020.04.02 |
---|---|
모든 div 컨텐츠를 비활성화하는 방법 (0) | 2020.04.02 |
jQuery 세트 선택 색인 (0) | 2020.04.02 |
핸들 막대의 인덱스를 사용하여 액세스 배열 항목에 어떻게 액세스합니까? (0) | 2020.04.02 |
.gitignore에 나열되었지만 여전히 저장소에있는 파일을 제거하는 방법은 무엇입니까? (0) | 2020.04.02 |