【问题标题】:Using a loop to fill up an array with desired properties使用循环填充具有所需属性的数组
【发布时间】:2021-04-03 14:47:53
【问题描述】:

我正在使用 java,并且在为我需要的任务正确制定循环时遇到了一些麻烦。我想将元素添加到 3 元素数组中,以便满足这些条件:

array_new[0] = f(array_old[0], array_old[1])
array_new[1] = f(array_old[0], array_old[2])
array_new[2] = f(array_old[1], array_old[2])

这里array_new 是我希望使用循环填充的数组,array_old 是一个现有数组,它为f 提供参数,这是一个先前定义的方法。请注意这里f(a,b)=f(b,a),并且我不想要重复的参数或重复的输出:所以没有f(a,a),也没有f(b,a),因为在循环中已经到达f(a,b)。所有这些单独的部分都已定义并正常工作,我的问题只是让循环的逻辑正确。这是我最初尝试的:

for (int i=0; i<array_old.length; i++) {
for (int j=0; j<array_old.length; j++) {
for (int k=0; k<array_old.length; k++) {
    
    if (i<j) {
    array_new[k]=f(array_old[i], array_old[j]);
    }
}
}
}   

但是我意识到这个更新 array_new[0] 违背了我的意愿:首先它根据需要设置array_new[0] = f(array_old[0], array_old[1]),然后它设置array_new[0] = f(array_old[1], array_old[2])

我尝试过以几种不同的方式处理索引,但似乎总是至少有一个重复或不正确的值。如有任何帮助,我将不胜感激

【问题讨论】:

  • 数组总是长度为 3 吗?如果它们不是可变的,我不会使用循环。
  • @soothsooth 出于我的目的,它们将是可变的,我只是使用长度 3 来了解逻辑并测试我的循环。

标签: java arrays loops for-loop logic


【解决方案1】:

这可以通过以下方式实现,arr_new 的大小可以计算为从 1 到n - 1 的级数之和,其中narr_old 的长度:

int[] arr_old = {1, 2, 3};
int n = arr_old.length;

int[] arr_new = new int[n * (n - 1) / 2];
for (int i = 0, k = 0; i < n - 1; i++) {
    for (int j = i + 1; j < n; j++, k++) {
        arr_new[k] = f(arr_old[i], arr_old[j]);
    }
}

System.out.println(Arrays.toString(arr_new));

假设f 打印它的参数并返回一个总和:

static int f(int a, int b) {
    System.out.println(a + " " + b);
    return a + b;
}

输出如下:

1 2
1 3
2 3
[3, 4, 5]

【讨论】:

  • 这绝对是完美的,非常感谢
  • 我能问一下,这个公式是怎么来得这么快的,你会如何建议刚接触编程的人帮助他们在这种情况下找到正确的路径?
【解决方案2】:

第一件事是表征新数组的大小 - 对于 n > 3,它将(远)大于输入数组。您正在寻找旧数组中两个索引的每个组合,其中顺序无关紧要,所以第一步是

 new_array <- array of size (n choose 2) = 0.5*n*(n-1)

然后您需要以有序的方式生成所有数字对。我会使用双重嵌套的 for 循环,计数器记录新数组中的当前索引:

 int p = 0
 for (i = 0; i < n; ++i) {
      for (j = i + 1; j < n; ++j) {
           new_array[p] = f(old_array[i], old_array[j])
           p = p + 1
      }
 }

注意如何通过正确设置初始化 j 来避免浪费的迭代和比较。

【讨论】:

  • 谢谢,这真的很有帮助。至少我可以说我已经知道我正在创建一个大小数组(n 选择 2),但是您的循环非常简洁且解释清楚
猜你喜欢
  • 2015-09-18
  • 2020-09-11
  • 2017-03-30
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多