2016-12-19 7 views
-1

Я пытаюсь создать программу, которая читает два текстовых файла, которые содержат тысячи слов. Мне нужно иметь возможность выбирать 10 слов в случайном порядке из каждого файла и хранить их в массиве из четырех строковых списков. Я создал следующий код до сих пор, однако это только выбирает одно слово из каждого файла, а не 10. Как это можно сделать - желательно использовать оператор if?Случайно выберите 10 слов из текстового файла

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Random; 
import java.util.Scanner; 

public class RandomWordGenerator { 

public static void main(String[] args) throws FileNotFoundException { 

public class RandomWordGenerator { 
public static void main(String[] args) throws IOException { 
    Path outputFile = Paths.get("output.txt"); 
    ArrayList<String> randomWords1 = randomWordsFromFile("textfile1.txt", 10); 
    ArrayList<String> randomWords2 = randomWordsFromFile("textfile2.txt", 10); 
    OutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(outputFile, CREATE)); 
    System.out.println(randomWords1); 
    System.out.println(randomWords2); 
    outputStream.flush(); 
    for (int i = 0; i < randomWords1.size(); i++) { 
     outputStream.write(randomWords1.get(i).getBytes()); 
    } 
    for (int i = 0; i < randomWords2.size(); i++) { 
     outputStream.write(randomWords2.get(i).getBytes()); 
    } 
    outputStream.close(); 
} 

private static ArrayList<String> randomFromFile(String fileName, int count) throws FileNotFoundException { 
    Scanner scanner = new Scanner(new File(fileName)); 
    ArrayList<String> words = new ArrayList<>(); 
    while (scanner.hasNext()) { 
     words.add(scanner.next()); 
    } 
    return randomFromWords(words, count); 
} 

static private ArrayList<String> randomFromWords(ArrayList<String> words, int count) { 
    ArrayList<String> randomWords = new ArrayList<>(); 
    for (int i = 0; i < count;) { 
     int random = new Random().nextInt(words.size()); 
     if (randomWords.add(words.get(random))) { 
      i++; 
     } 
    } 
    return randomWords; 
    } 
} 

ответ

0
import java.io.*; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.ArrayList; 
import java.util.Random; 
import java.util.Scanner; 

import static java.nio.file.StandardOpenOption.CREATE; 

public class RandomWordGenerator { 
    public static void main(String[] args) throws IOException { 
     Path outputFile = Paths.get("output.txt"); 
     ArrayList<String> randomWords1 = randomWordsFromFile("input1.txt", 10); 
     ArrayList<String> randomWords2 = randomWordsFromFile("input2.txt", 10); 
     OutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(outputFile, CREATE)); 
     System.out.println(randomWords1); 
     System.out.println(randomWords2); 
     outputStream.flush(); 
     for (int i = 0; i < randomWords1.size(); i++) { 
      outputStream.write(randomWords1.get(i).getBytes()); 
     } 
     for (int i = 0; i < randomWords2.size(); i++) { 
      outputStream.write(randomWords2.get(i).getBytes()); 
     } 
     outputStream.close(); 
    } 

    private static ArrayList<String> randomWordsFromFile(String fileName, int count) throws FileNotFoundException { 
     Scanner scanner = new Scanner(new File(fileName)); 
     ArrayList<String> words = new ArrayList<>(); 
     while (scanner.hasNext()) { 
      words.add(scanner.next()); 
     } 
     return randomFromWords(words, count); 
    } 

    static private ArrayList<String> randomFromWords(ArrayList<String>  words, int count) { 
     ArrayList<String> randomWords = new ArrayList<>(); 
     for (int i = 0; i < count;) { 
      int random = new Random().nextInt(words.size()); 
      if (randomWords.add(words.get(random))) { 
       i++; 
      } 
     } 
     return randomWords; 
    } 
    } 
+0

Является ли это вместо кода, который я включил выше? – NoahSM1993

+0

выше код не давал случайных строк и не давал точного количества отсчетов. код i post будет делать как –

+0

Как бы сериализовать два списка в двоичном файле? Потому что, хотя программа выше выбирает 10 слов наугад и распечатывает их, на самом деле она не хранит слова? – NoahSM1993

1

Сформировать 10 случайных чисел с помощью Math.random() и времени их по размеру вашего массива чисел (так как они являются значения от 0 до 1) и использовать эти номера для выбора элементов из вашего массива. Например, попробуйте выполнить цикл 10 раз: Array[Math.random()*sizeOfArray]

+0

Иногда это может быть одно и то же слово. Не знаю, будет ли все в порядке. Исправления включают в себя: (1) повторите попытку, если вы получили слово, которое уже было выбрано один раз (2), перетасовать список, а затем взять 10 первых записей. –

+1

Вы также можете выбрать элемент, удалив его из списка: String newPick = arrayList.remove (Math.random() * arrayList.size()); Поэтому его больше не будет выбрано. – FeinesFabi

+0

перетасовать список, а затем выбрать первые 10 элементов из него – ivanivan