Java 生成所有可能的6长度字符串并写入文件的最快方法是什么?

Java 生成所有可能的6长度字符串并写入文件的最快方法是什么?,java,performance,Java,Performance,我想生成所有可能的6长度字符串 我需要这种格式: aaa000 aaa001 这是我的密码: private List<String> licensePlateList = new ArrayList<>(); private List<String> numberList = new ArrayList<>(); private List<String> letterList = new ArrayList<>();

我想生成所有可能的6长度字符串 我需要这种格式: aaa000 aaa001

这是我的密码:

private List<String> licensePlateList = new ArrayList<>();
private List<String> numberList = new ArrayList<>();
private List<String> letterList = new ArrayList<>();

public static void main(String[] args) {
    Main app = new Main();
    long start = System.nanoTime();

    app.generateNumbers();
    int letters = 26;
    int count = 3;
    final int combinations = (int) Math.pow(letters, count);
    StringBuilder sb = new StringBuilder(count);
    for (int i = 0; i < combinations; i++) {
        sb.setLength(0);
        for (int j = 0, i2 = i; j < count; j++, i2 /= letters)
            sb.insert(0, (char) ('a' + i2 % letters));
        app.letterList.add(sb.toString());
    }

    long time = System.nanoTime() - start;
    System.out.printf("Took %.3f seconds to generate", time / 1e9);

    for (int i=0;i<app.letterList.size();i++){
        for (int j=0;j<app.numberList.size();j++){
            String licensePlate = app.letterList.get(i)+app.numberList.get(j);
            try(FileWriter fw = new FileWriter("licensePlate2.txt", true);
                BufferedWriter bw = new BufferedWriter(fw);
                PrintWriter out = new PrintWriter(bw))
            {
                out.println(licensePlate);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    time = System.nanoTime() - start;
    System.out.printf("Took %.3f seconds to generate %,d combinations%n", time / 1e9, app.licensePlateList.size());
}

private void generateNumbers(){
    for (int i=0;i<1000;i++){
        numberList.add(String.format("%03d", i));
    }
}
}
private List licensePlateList=new ArrayList();
private List numberList=new ArrayList();
private List letterList=new ArrayList();
公共静态void main(字符串[]args){
主应用程序=新主应用程序();
长启动=System.nanoTime();
app.generateNumbers();
整数字母=26;
整数计数=3;
最终整数组合=(int)Math.pow(字母,计数);
StringBuilder sb=新StringBuilder(计数);
对于(int i=0;i<组合;i++){
sb.设定长度(0);
for(int j=0,i2=i;j对于(inti=0;i,您的算法为每个牌照打开一个新的写入程序

相反,打开一个writer并将其全部写入:

try(FileWriter fw = new FileWriter("licensePlate2.txt", true);
    BufferedWriter bw = new BufferedWriter(fw);
    PrintWriter out = new PrintWriter(bw)) {
    for (String letters : app.letterList) {
        for (String numbers : app.numberList) {
            out.print(letters);
            out.println(numbers);
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}
请注意,此代码如何通过分别写入每个字符串来避免为整个许可证编号创建中间字符串

还要注意“for each”循环的使用

代码如下:

import java.io.*;

public class Test {

    public static void main(String[] args) throws Exception {
        char sb[] = new char[7];
        sb[6] = '\n';

        int count = 0;
        long startTime = System.currentTimeMillis();

        BufferedWriter out = new BufferedWriter(new FileWriter(args[0]));

        for (char a = 'a'; a <= 'z'; a++) {
            sb[0] = a;
            for (char b = 'a'; b <= 'z'; b++) {
                sb[1] = b;
                for (char c = 'a'; c <= 'z'; c++) {
                    sb[2] = c;
                    for (char d = '0'; d <= '9'; d++) {
                        sb[3] = d;
                        for (char e = '0'; e <= '9'; e++) {
                            sb[4] = e;
                            for (char f = '0'; f <= '9'; f++) {
                                sb[5] = f;
                                out.write(sb);
                                count++;
                            }
                        }
                    }
                }
            }
        }
        out.close();
        long endTime = System.currentTimeMillis();
        System.err.println("Generated " + count + " combinations in " + (endTime - startTime) / 1000.0 + " seconds");
    }
}
import java.io.*;
公开课考试{
公共静态void main(字符串[]args)引发异常{
字符sb[]=新字符[7];
sb[6]='\n';
整数计数=0;
long startTime=System.currentTimeMillis();
BufferedWriter out=新的BufferedWriter(新文件写入程序(args[0]);

对于(char a='a';a为什么需要生成此列表?如果因为需要列表执行其他操作而需要生成此列表,为什么不缓慢生成一次,然后将值硬编码到程序中?这可能与“快速”差不多如你所知。我有一个考试,这是第一个任务,我必须处理它的结果。但是我的代码没有在3小时内完成,现在我想知道最快的方法是什么。谢谢!用你的代码,我在13秒内生成了所有可能的字符串!这真的很快!
import java.io.*;

public class Test {

    public static void main(String[] args) throws Exception {
        char sb[] = new char[7];
        sb[6] = '\n';

        int count = 0;
        long startTime = System.currentTimeMillis();

        BufferedWriter out = new BufferedWriter(new FileWriter(args[0]));

        for (char a = 'a'; a <= 'z'; a++) {
            sb[0] = a;
            for (char b = 'a'; b <= 'z'; b++) {
                sb[1] = b;
                for (char c = 'a'; c <= 'z'; c++) {
                    sb[2] = c;
                    for (char d = '0'; d <= '9'; d++) {
                        sb[3] = d;
                        for (char e = '0'; e <= '9'; e++) {
                            sb[4] = e;
                            for (char f = '0'; f <= '9'; f++) {
                                sb[5] = f;
                                out.write(sb);
                                count++;
                            }
                        }
                    }
                }
            }
        }
        out.close();
        long endTime = System.currentTimeMillis();
        System.err.println("Generated " + count + " combinations in " + (endTime - startTime) / 1000.0 + " seconds");
    }
}