2016-02-10 58 views
1

我希望能够从文件中读取20个随机名并将它们放入一个新文件中。我如何去做这件事?遇到文件输出问题

public class Assignment2 { 

    public static void main(String[] args) throws IOException 
    { 
     // Read in the file into a list of strings 
     BufferedReader reader = new BufferedReader(new FileReader("textfile.txt")); 
     //BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt")); 
     List<String> lines = new ArrayList<String>(); 

     String line = reader.readLine(); 

     while(line != null) { 
      lines.add(line); 
      line = reader.readLine(); 
     } 

     // Choose a random one from the list 
     Random r = new Random(); 

     for (int i = 0; i < 20; i++) 
     { 
      int rowNum = r.nextInt(lines.size()); 
      System.out.println(lines.get(rowNum)); 
     } 

    } 
} 

回答

0
try (BufferedWriter writer = new BufferedWriter(new FileWriter("randomNames.txt"))) { 

    Random random = new Random(); 

    for (int i = 0; i < 20; i++) { 
     int rowNum = random.nextInt(lines.size()); 
     writer.write(lines.get(rowNum)); 
     writer.newLine(); 
    } 
} 

如果需要检查,如果已经使用了一些数字,它添加到一组:

try (BufferedWriter writer = new BufferedWriter(new FileWriter("randomNames.txt"))) { 
    Set<Integer> usedNumbers = new HashSet<Integer>(20); 
    Random random = new Random(); 
    int addedCount = 0; 

    while (addedCount < 20) { 
     int rowNum = random.nextInt(lines.size()); 
     if (usedNumbers.add(rowNum)) { 
      writer.write(lines.get(rowNum)); 
      writer.newLine(); 
      addedCount++; 
     } 
    } 
} 

要检查是否有另一个名字与相同的第一个字符:

private static void containsNameWithSameFirstCharacter(Collection<String> names, String name) { 
    for (String anotherName : names) { 
     if (anotherName.charAt(0) == name.charAt(0)) { 
      return true; 
     } 
    } 
    return false; 
} 

然后你这样做:

Random random = new Random(); 
    Set<String> usedNames = new HashSet<String>(20); 

    while (usedNames.size() < 20) { 
     int rowNum = random.nextInt(lines.size()); 
     String name = lines.get(rowNum); 
     if (!containsNameWithSameFirstCharacter(usedNames, name)) { 
      usedNames.add(name); 
      writer.write(name); 
      writer.newLine(); 
     } 
    } 
+0

谢谢..你谈过我是否需要检查一个数字是否被使用..以及我需要确保没有相同的第一个字母重复的名称。我该如何解决这个问题? – CorDell

+0

获得一个随机数,使用这个数字得到一个名字,检查是否不是一个重复的名字(使用一个使用过的名字集合)。如果它不是重复的名称,请添加到集合中。直到收集到20个元素为止。 – andrucz

+0

但它不能成为第一个字母。如果玛丽已经在列表中,那么马克不能是 – CorDell