случайная выборка подмножества arraylist без замены

#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, как это увеличивает вероятность выбора нового элемента в списке? Чем это отличается от простого перемешивания и выбора фиксированных индексов, скажем, первых трех?