当前位置: 首页 > 知识库问答 >
问题:

在Java中求和随机嵌套数组的基本元素?

尉迟阳煦
2023-03-14

给定一个多维整数数组,如何找到所有基本元素的总和?每个数组中可能具有不同数量的数组,因此我的算法必须灵活以适应所有可能的输入。递归方法似乎是最优雅的解决方案。例:

鉴于:

array = {
   {{1,2,3},
   {4,5},
   {6,7,8}},
   {{9},{10}}
}

返回: 55

请注意,每个子数组的长度不一致且各不相同,数组的深度也是如此。这意味着传统的循环将无法检查数组的长度,递归方法将无法将循环的维数定义为初始参数。也许递归循环需要将Object转换为数组?

编辑:

该方法还应该能够对任意维数的数组求和。例如,输入数组可以有三个维度,甚至7个维度。

共有2个答案

公冶子琪
2023-03-14

不使用streams或lambdas的另一种可能性是编写一个简单的递归方法。就像这种性质的其他冲突一样,类型冲突只会在运行时出现。

对于以下嵌套数组结构:

      Integer[][][][] array = { { { { 1, 2, 3
            }, { 4, 5, 6
            }, { 7, 8, 9
            }
            }, { { 10, 11, 12,
            }, { 13, 14, 15
            }, { 16, 17, 19
            }
            }
            }, { { { 20, 21, 22
            }, { 23, 24, 25
            }
            }
            }
      };

   System.out.println(sum(array));

   public static int sum(Object[] a) {
      int sum = 0;
      for (Object o : a) {
         if (o instanceof Object[]) {
            sum += sum((Object[]) o);
         }
         if (o instanceof Integer) {
            sum += (Integer) o;
         }
      }
      return sum;
   }

打印

307

仉英朗
2023-03-14

使用Java流,你可以只使用这个(假设你的数组有2个维度):

int[][] array = {{1, 2, 3}, {4, 5}, {6, 7, 8}, {9, 10}};
int sum = Arrays.stream(array)
        .flatMapToInt(Arrays::stream)
        .sum();

如果阵列有3个维度,则可以将其扩展到以下维度:

int[][][] array = {{{1, 2, 3}, {4, 5}, {6, 7, 8}}, {{9}, {10}}};
int sum = Arrays.stream(array)
        .flatMap(Arrays::stream)
        .flatMapToInt(Arrays::stream)
        .sum();

要处理深度未知的数组,可以使用此方法展平它们:

private static Stream<Object> flatMapDynamicArray(Object[] array) {
    return Arrays.stream(array)
            .flatMap(o -> o.getClass().isArray() ? 
                    flatMapDynamicArray((Object[]) o) : 
                    Stream.of(o));
}

您还可以使用o instanceof Object[]代替o.getClass()。isArray()但对于我的测试,第二个测试的性能更好。

像这样使用此方法:

Integer[][][] array = {{{1, 2, 3}, {4, 5}, {6, 7, 8}}, {{9}, {10}}};
int sum = flatMapDynamicArray(array)
        .mapToInt(i -> (int) i)
        .sum();

对于您共享的阵列,在所有情况下的结果都是55

 类似资料:
  • 有没有一种方法可以让你使用打印给定数组中的元素? 所以输出将是 或者 或

  • 问题内容: 我有一个字符串数组: 我从中得到随机元素: 现在我想获得当我按下按钮以获取随机水果时苹果所处的数字,例如当我按下randon按钮时,它给了我Banana ..并且还应该给我那个元素编号是 我得到了元素,但是获取元素编号有问题,所以请帮帮我 问题答案: 只需将生成的索引存储在变量中,然后使用此变量访问数组: PS我通常不喜欢每次随机化生成新对象-我更喜欢在程序中使用单个对象- 然后重新使

  • 问题内容: 我有一个像这样的数组: 我想从该数组中获取3个随机元素。我来自C#,但是我不确定该从哪里开始。我想我应该先对数组进行随机排序,然后再从中选择前3个项目? 我尝试使用以下扩展名将其改组: 但随后在“ shuffle()”的位置说“’()’不可转换为’[Int]’”。 为了挑选一些元素,我使用: 到目前为止看起来还不错。 如何洗牌?还是有人对此有更好/更优雅的解决方案? 问题答案: Xco

  • 嗨,伙计们,我有这个阵列,可以打印5x5 1 我想做的是随机地将这些1中的三(3)个设为0。实例 我该怎么做?提前感谢您!

  • 我试图编写一个方法rollDice(int number,int nSides),它返回用nSides边滚动数字骰子的总结果。

  • 下面是一个java类CreateDoc,它从一个作为生产者端的web服务发送到另一个作为消费者端的web服务,其内容类型为:json 下面是类表示 一旦我在消费者端接收到作为json的列表,我就不能将其用作java对象,并且内容类型是数组,其中json嵌套在数组中。 以下是代表: 问题是如何处理这一点,并能够使用数据和表示为列表。