java - 打印二维锯齿状数组中的字符串组合

标签 java arrays string multidimensional-array jagged-arrays

假设我有一个字符串数组,如下所示:

{{"blue", "red"}, {"1", "2", "3"}, {"dog", "cat", "fish", "bird"}}

我想打印数组的组合:

blue 1 dog
blue 1 cat
...
...
red 3 bird

但是我希望锯齿状数组具有用户指定的行和列。如何创建 similar approach但以动态和迭代的方式?此外,我正在使用数组而不是 ArrayList,因为作为初学者,我想在学习 ArrayList 之前了解我可以使用数组做什么。我的代码如下:

Scanner input = new Scanner(System.in);
System.out.print("Enter number of arrays: ");
int arrays = input.nextInt();
String[][] array = new String[arrays][];

for (int i = 0; i < x; i++) {
    System.out.print("Enter number of elements for array: ");
    int elements = input.nextInt();
    input.nextLine();
    arrays[i] = new String[elements];

    for (int j = 0; j < elements; j++) {
        System.out.print("Enter string: ");
        String word = input.nextLine();
        arrays[i][j] = word;
    }
}

最佳答案

此答案将打印所有组合,不使用递归,但如果组合总数超过 Long.MAX_VALUE,则会失败。因为打印那么多行无论如何都不会结束,所以这不是真正的问题。

要按顺序打印组合,请考虑一个递增的数字,其中数字的每个数字都是相应子列表的索引。

示例(使用问题列表的列表):

000: blue 1 dog
001: blue 1 cat
002: blue 1 fish
003: blue 1 bird
010: blue 2 dog
...
121: red 3 cat
122: red 3 fish
123: red 3 bird

每个“数字”在到达相应子列表的末尾时将翻转,例如最后一个子列表只有 4 个元素,所以数字从 3 翻转到 0。

注意:一个“数字”可以计数大于 9。想想十六进制的一种表示方式。

现在,位数也是动态的,即外部列表的大小。使用简单循环执行此操作的一种方法是计算组合总数 (2 * 3 * 4 = 24),然后使用除法和余数计算数字。

例子:

Combination #10 (first combination is #0):
  10 % 4                 = 2 (last digit)
  10 / 4 % 3     = 2 % 3 = 2 (middle digit)
  10 / 4 / 3 % 2 = 0 % 2 = 0 (first digit)
  Digits: 022 = blue 3 fish

为此,我们首先构建一个除数数组,例如div[] = { 12, 4, 1 },求组合总数(24)。

long[] div = new long[array.length];
long total = 1;
for (int i = array.length - 1; i >= 0; i--) {
    div[i] = total;
    if ((total *= array[i].length) <= 0)
        throw new IllegalStateException("Overflow or empty sublist");
}

现在我们可以遍历组合并打印结果:

for (long combo = 0; combo < total; combo++) {
    for (int i = 0; i < array.length; i++) {
        int digit = (int) (combo / div[i] % array[i].length);
        if (i != 0)
            System.out.print(' ');
        System.out.print(array[i][digit]);
    }
    System.out.println();
}

根据问题输入:

String[][] array = {{"blue", "red"}, {"1", "2", "3"}, {"dog","cat", "fish", "bird"}};

我们得到以下输出:

blue 1 dog
blue 1 cat
blue 1 fish
blue 1 bird
blue 2 dog
blue 2 cat
blue 2 fish
blue 2 bird
blue 3 dog
blue 3 cat
blue 3 fish
blue 3 bird
red 1 dog
red 1 cat
red 1 fish
red 1 bird
red 2 dog
red 2 cat
red 2 fish
red 2 bird
red 3 dog
red 3 cat
red 3 fish
red 3 bird

它可以处理子数组的任意组合,例如具有 4 个大小为 2、3、2 和 2 的子数组:

String[][] array = {{"small", "large"}, {"black", "tan", "silver"}, {"lazy", "happy"}, {"dog", "cat"}};
small black lazy dog
small black lazy cat
small black happy dog
small black happy cat
small tan lazy dog
small tan lazy cat
small tan happy dog
small tan happy cat
small silver lazy dog
small silver lazy cat
small silver happy dog
small silver happy cat
large black lazy dog
large black lazy cat
large black happy dog
large black happy cat
large tan lazy dog
large tan lazy cat
large tan happy dog
large tan happy cat
large silver lazy dog
large silver lazy cat
large silver happy dog
large silver happy cat

关于java - 打印二维锯齿状数组中的字符串组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46374381/

相关文章:

java - 查询从 "UTF-8"world读取字节到Java "char"

java - MD5 和 Hibernate 查询

java - 如何找到对数组进行排序所需的最大组数?

Javascript 压扁深层嵌套的子项

Java 快速字符串匹配(将文本关联到类别)

java - 在对我的 Java 应用程序进行基准测试时,如何补偿没有 "quiet"机器的情况?

java - 在Android Java中编写此Sqlite选择查询

javascript - 排序数组中的公共(public)值段

c++ - 当没有字符串匹配时,在 String 中查找函数会输出垃圾

java - 发送电子邮件时更改文本(字符串)的颜色