Java语言有4个文件,一共4x4=16行,输出组合的全部结果到文件,思路用循环但是代码写不来

Java语言有4个文件,将每个文件取出一行,得到4行,一共4x4=16行,怎么组合,输出组合的全部结果到文件,思路用循环但是代码写不来

  • 将每个文件任意取一行组合,考虑顺序会有44 = 256组会,不考虑顺序,也有192。

    img

  • Python 模拟代码

#!/sur/bin/nve python
# coding: utf-8


file1 = '1', '2', '3', '4'
file2 = '壹', '贰', '叁', '肆'
file3 = 'a', 'b', 'c', 'd'
file4 = 'A', 'A', 'B', 'D'
newfile = []

for line1 in file1:
    for line2 in file2:
        for line3 in file3:
            for line4 in file4:
                line = set([line1, line2, line3, line4])
                if line not in newfile:
                    newfile.append(line)
        

print(f"\n{len(newfile)}")

我是用四层循环穷举所有组合,将列表newfile内容写入文本文件即合题目要求。我仅会点python ,用python 代码表达一下。😋


可以用循环 但是我推荐用递归
在这个实现中,我们使用了一个静态常量FILE_NUM来表示文件的数量,使用了一个静态常量LINE_LENGTH来表示每行数据的长度。我们使用了一个字符数组lines来存储每个文件中的一行数据。我们使用了一个StringBuilder对象sb来存储拼接的结果字符串,使用了一个List对象results来存储所有的拼接结果。

在main方法中,我们首先打开4个文件并读取每个文件的第一行数据,将数据存储到lines数组中。然后,我们调用combine方法来进行拼接。combine方法接受一个参数index,表示当前正在拼接第index个文件的数据。如果index等于FILE_NUM,说明所有文件的数据都已经拼接完成,将结果字符串添加到results列表中即可。否则,我们依次将第index个文件中的每个字符添加到sb中,并递归调用combine方法来拼接下一个文件的数据。当递归完成后,我们将sb中最后一个字符删除,以便下一次拼接。


import java.io.*;
import java.util.*;

public class FileCombination {
    private static final int FILE_NUM = 4;
    private static final int LINE_LENGTH = 4;
    private static final char[][] lines = new char[FILE_NUM][LINE_LENGTH];
    private static final StringBuilder sb = new StringBuilder();
    private static final List<String> results = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        BufferedReader[] readers = new BufferedReader[FILE_NUM];
        for (int i = 0; i < FILE_NUM; i++) {
            readers[i] = new BufferedReader(new FileReader("file" + (i + 1) + ".txt"));
            lines[i] = readers[i].readLine().toCharArray();
        }

        combine(0);

        BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
        for (String result : results) {
            writer.write(result);
            writer.newLine();
        }
        writer.close();

        for (BufferedReader reader : readers) {
            reader.close();
        }
    }

    private static void combine(int index) {
        if (index == FILE_NUM) {
            results.add(sb.toString());
            return;
        }
        for (int i = 0; i < LINE_LENGTH; i++) {
            sb.append(lines[index][i]);
            combine(index + 1);
            sb.deleteCharAt(sb.length() - 1);
        }
    }
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: Java书城项目第一阶段:表单验证中的 4 第一阶段技术栈参考资料 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    • JQuery-链接
    • 正则表达式
    • HTML
    • JavaScript之事件的注册
  • 以下回答来自chatgpt:

    我可以给出一个使用循环实现文件行组合并输出到新文件的示例代码。代码如下所示:

    import java.io.*;
    
    public class FileCombiner {
        public static void main(String[] args) {
            try {
                // 定义需要读取的文件路径
                String[] filePaths = {"file1.txt", "file2.txt", "file3.txt", "file4.txt"};
                // 定义输出文件路径
                String outputPath = "output.txt";
    
                // 创建输出文件
                File outputFile = new File(outputPath);
                FileWriter writer = new FileWriter(outputFile);
    
                // 定义文件读取器的数组
                BufferedReader[] readers = new BufferedReader[filePaths.length];
                for (int i = 0; i < filePaths.length; i++) {
                    // 创建文件读取器
                    readers[i] = new BufferedReader(new FileReader(filePaths[i]));
                }
    
                // 逐行读取每个文件的内容,并将组合结果写入输出文件
                String[] lines = new String[filePaths.length];
                boolean eof = false; // 是否到达文件末尾的标志
                while (!eof) {
                    for (int i = 0; i < filePaths.length; i++) {
                        // 逐行读取每个文件的内容
                        lines[i] = readers[i].readLine();
    
                        // 判断是否到达文件末尾
                        if (lines[i] == null) {
                            eof = true;
                            break;
                        }
                    }
    
                    // 将每行内容组合并写入输出文件
                    if (!eof) {
                        // 组合行内容
                        String combinedLine = "";
                        for (String line : lines) {
                            combinedLine += line + " ";
                        }
                        combinedLine = combinedLine.trim();
    
                        // 写入输出文件
                        writer.write(combinedLine + "\n");
                    }
                }
    
                // 关闭文件读取器和写入器
                for (BufferedReader reader : readers) {
                    reader.close();
                }
                writer.close();
    
                System.out.println("文件组合完成!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    在这个示例代码中,首先定义了需要读取的文件路径和输出文件路径。然后创建了输出文件,并使用BufferedReaderFileReader创建了文件读取器数组。接着利用一个循环逐行读取每个文件的内容,并将每行内容组合后写入输出文件。最后关闭文件读取器和写入器。

    希望这个示例代码对你有帮助!如果你还有其他问题,请继续提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

参考代码

import java.io.*;
import java.util.*;

public class FileCombination {
    public static void main(String[] args) {
        String[] fileNames = {"file1.txt", "file2.txt", "file3.txt", "file4.txt"}; // 文件名数组
        String outputFile = "output.txt"; // 输出文件路径

        List<List<String>> fileLines = new ArrayList<>();

        // 读取每个文件的内容
        for (String fileName : fileNames) {
            List<String> lines = new ArrayList<>();
            try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    lines.add(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            fileLines.add(lines);
        }

        List<String> combinedLines = combineLines(fileLines, 0, new StringBuilder());

        // 输出结果到文件
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
            for (String line : combinedLines) {
                writer.write(line);
                writer.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("组合结果已输出到文件:" + outputFile);
    }

    // 递归实现排列组合
    private static List<String> combineLines(List<List<String>> fileLines, int level, StringBuilder sb) {
        List<String> result = new ArrayList<>();

        if (level == fileLines.size()) {
            result.add(sb.toString());
            return result;
        }

        List<String> currentLines = fileLines.get(level);
        for (String line : currentLines) {
            sb.append(line);
            result.addAll(combineLines(fileLines, level + 1, sb));
            sb.delete(sb.length() - line.length(), sb.length());
        }

        return result;
    }
}