【问题标题】:Adding value to Java array with fixed length将值添加到具有固定长度的 Java 数组
【发布时间】:2016-08-03 07:55:25
【问题描述】:

我有一个基于另一个数组大小声明的数组,最初所有值都设置为 0,尽管动态分配的大小是固定的(等于其他数组大小),这在 Java 中是必需的。接下来我有一个带有某些if-else 条件的for 循环。如果条件是true,则类似地将1添加到数组第一个索引如果下一次迭代是true,则将1添加到第二个索引并继续。 我希望稍后数组是二进制的,所以如果我得到 1,则意味着所有条件都是true,如果它是 0,则意味着某些条件是 false。 我不赞成使用ArrayList,我也不确定我是否可以限制ArrayList的长度,因为当我这样做并打印它时,它会显示大小为0。

How can I dynamically add items to a Java array?

说明我的要求,但不使用 ArraylistList 等,因为我发现的大多数相关答案都建议使用 ArrayList。

谢谢

【问题讨论】:

  • 如果数组元素只能是01,为什么不直接改成boolean[] 呢?同样的事情,更清晰的意图。
  • 是的,这是一个很好的建议,但我怎样才能像添加 arraylist 那样按顺序添加 1
  • 您是要修改现有元素还是添加新元素?我想你可能会在这里感到困惑。 ArrayLists 对于动态大小的 集合很有用,常规数组适用于固定长度集合中的动态值
  • 我正在尝试@elyashiv 的回答。如果不工作,那么我肯定会发布代码以供进一步讨论。感谢您的时间和关心。我真的很感谢像你这样努力给时间的人
  • @walen 感谢您的帮助,我已经接受了答案并且它正在工作。感谢您的宝贵时间。

标签: java arrays dynamic


【解决方案1】:

为什么不这样做:

for (int i = 0; i < arr.length; i++)
{
   if ( ... )
      arr[i] = 1;
   else ...
   if (...)
      arr[i] = 1;
}

如果是嵌套循环和更复杂的逻辑,您可以这样做:

int index = 0;
boolean flag = true;
while (still have what to do)
{
   for <complicated logic>
   if (flag)
   {
      arr[index] = 1;
      index++;
   }
   flag = true;
}

只要确保每个条件都像这样累积到标志中 - flag = flag &amp;&amp; condition

请注意,您可以将条件短路 - 如果您得到一个错误,您可以跳过检查其余条件。

【讨论】:

  • 实际上有四个嵌套循环,并且跟踪相对于for循环的索引是不可能的,我的数组长度可以是3,内部循环可以超过3(可能在我的场景)。所以我需要一些基于提供的场景的解决方案。
【解决方案2】:
for (i =0 ; i != len ; i++) arr[i] = condition

【讨论】:

  • 不适用于 int 数组 - java 不是 c... 您可以更改为 condition ? 1 : 0
  • @elyashiv 它也不起作用,因为我有i = 0 而不是int i =
  • 是的,但是很少有人会犯在使用前不声明 var 的错误。
  • @elyashiv 我认为不声明循环变量比使用布尔值更严重的错误。
【解决方案3】:

使用BitSet,用于最终的 AND 功能:

BitSet bits = new BitSet(array.length);
for (int i = 0; i < array.length; ++i) {
    bits.set(i, ... true or false);
}

boolean allTrue = bits.cardinality() == array.length();
boolean allFalse = bits.cardinality() == 0; // Or bits.isEmpty()

【讨论】:

  • 是更好还是我应该循环遍历数组并为简单起见对它们使用 AND 。虽然可能效率不高。 @JonK:鹰眼
  • BitSet 具有查找下一个或上一个设置位 1 的方法。但是 cardinality() 产生的位数设置为 1,因此请使用 allTrue。对于 allFalse isEmpty() of Set 也有效。
  • 我不会担心使用BitSet 与手动操作相比的性能 - 除非您正在处理数以百万计的列表编号,否则它充其量只是一个微优化。使用对您来说最清楚的任何内容。如果bits.cardinality() == array.length对你来说很清楚,那么就使用它,如果没有,就不要使用它。
  • 是的,在我的情况下它可能少于 10 个,所以我最好手动操作一下。
【解决方案4】:

我同意 ArrayList 是最简单、最直接的方法。

这样,您仍然可以使用简单的 array[] 来做到这一点,您只需要记住 array[] 的大小是固定的,如果您想增加它的大小,您需要在 a 中定义一个新的 array[]更大的尺寸(通常你会将原始尺寸翻倍)并将所有项目从原始数组复制到新数组。将索引保留到您正在使用的数组中的最后一个点也是一个好习惯。

【讨论】:

  • 否 数组大小是固定的,不需要更改以跟踪二进制 AND 函数。我只需要一个固定长度的数组,但是我如何像 add() 那样按顺序向它添加值是我需要的时间。
  • 那我没看懂问题,反正我看到你有答案了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
相关资源
最近更新 更多