#java #arraylist #shuffle
#java #arraylist #перемешать
Вопрос:
У меня есть входные данные, которые содержат по одному символу в каждой строке, и я использовал сканер для чтения в arralist (возможно). Я хотел бы иметь 1000 подмножеств данных случайным образом из этого arraylist (size = 3) и сохранять их в файл построчно (каждая строка является подмножеством).
Таким образом, входные данные выглядят так :
AAA
BBB
CCC
DDD
EEE
FFF
Ожидаемый результат будет:
AAA EEE FFF
CCC FFF BBB
DDD BBB AAA
Вот что у меня есть до сих пор. Я как бы зацикливаюсь на том, как указать 1000 раз перетасовки и как определить size = 3. Я ожидаю, что смогу перетасовать 1000 раз и выбрать первые 3 для каждого. Это моя стратегия.
public class sampling {
public static void main(String[] args) throws FileNotFoundException{
Scanner scan1 = new Scanner(new File("Symbol.txt"));
ArrayList<String> Wholelist = new ArrayList<>();
while (scan1.hasNextLine()){
String line = scan1.nextLine();
Wholelist.add(line);
}
try{
FileWriter stream = new FileWriter(args[2]);
BufferedWriter out = new BufferedWriter(stream);
for (int i=0,n=Wholelist.size();i<n; i ){
Collections.shuffle(Wholelist);
Wholelist.get(3);
}
}
catch (IOException e) {
System.err.println("Error: " e.getMessage());
}
}
}
Пожалуйста, попробуйте изменить его на основе моего кода, потому что я новичок в Java. Большое вам спасибо, если кто-нибудь может помочь.
Комментарии:
1. спасибо @tobias_k, я пытался отредактировать.
2. зачем перетасовывать, просто повторите свой входной список 1000 раз, чтобы рандомизировать его на каждой итерации, выберите любые три случайных индекса списка на каждой итерации и получите соответствующие элементы.
Ответ №1:
Вы на правильном пути. Просто повторите цикл 1000 раз вместо n! И чтобы получить первые три элемента списка, используйте метод subList(0, 3)
Ответ №2:
попробуйте что-то подобное в соответствии с вашими требованиями:
public static void main(String[] args) {
List<String> wholeList = new ArrayList<>();
wholeList.add("AAA");
wholeList.add("BBB");
wholeList.add("CCC");
wholeList.add("DDD");
wholeList.add("EEE");
wholeList.add("FFF");
wholeList.add("GGG");
int randomLimit = wholeList.size();
Random r = new Random();
for (int i = 0; i < 1000; i ) {
// get three random indices from 0(inclusive) to list max size
// (exclusive)
int u = r.nextInt(randomLimit);
int v = r.nextInt(randomLimit);
int w = r.nextInt(randomLimit);
// chose your format
System.out.print(wholeList.get(u) "t");
System.out.print(wholeList.get(v) "t");
System.out.println(wholeList.get(w));
}
}
Ответ №3:
Попробуйте это
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;
public class FileTester {
public static void main(String[] args) throws FileNotFoundException {
Scanner scan1 = new Scanner(new File("YOUR_INPUT_FILE"));
ArrayList<String> wholeList = new ArrayList<String>();
String line = "";
while (scan1.hasNextLine()) {
line = scan1.nextLine();
wholeList.add( line );
}
try {
FileWriter stream = new FileWriter("YOUR_OUTPUT_FILE");
BufferedWriter out = new BufferedWriter(stream);
for (int i = 0, n = wholeList.size(); i < n; i ) {
Random r = new Random();
Collections.shuffle(wholeList);
out.append(wholeList.get( r.nextInt(wholeList.size()) ) "t");
out.append(wholeList.get( r.nextInt(wholeList.size()) ) "t");
out.append(wholeList.get( r.nextInt(wholeList.size()) ) "t");
out.append("n");
}
out.close();
} catch (IOException e) {
System.err.println("Error: " e.getMessage());
}
}
}
Комментарии:
1. любое преимущество использования shuffle, как это увеличивает вероятность выбора нового элемента в списке? Чем это отличается от простого перемешивания и выбора фиксированных индексов, скажем, первых трех?