【问题标题】:Can I assign Java values from an ArrayList to different variables without hardcoding the size?我可以在不硬编码大小的情况下将 ArrayList 中的 Java 值分配给不同的变量吗?
【发布时间】:2011-11-18 04:58:02
【问题描述】:

我有一个 ArrayList,我们会说它的大小最多为 5。我想将第一个元素分配给 var1,第二个分配给 var2,第三个分配给 var3,等等。

但是,有时 ArrayList 的项目少于 5 个,在这种情况下,我不会为某些变量分配值。

所以我的问题是,有没有更好的方法来做到这一点:

if (myArrayList.size() > 0)
    var1 = myArrayList.get(0);
if (myArrayList.size() > 1)
    var2 = myArrayList.get(1);
if (myArrayList.size() > 2)
    var3 = myArrayList.get(2);
if (myArrayList.size() > 3)
    var4 = myArrayList.get(3);
if (myArrayList.size() > 4)
    var5 = myArrayList.get(4);

【问题讨论】:

  • 为什么不使用对象数组本身呢?首先你有存储在 ArrayList 中的值,它是用来做什么的?
  • 唯一明智的方法是避免它。您需要所有 varX 做什么?为什么不能使用 myArrayList.get(n) 代替?
  • 没有理由,我只是想知道 Java 是否有一种简单的方法可以避免输入一些 .get(n)

标签: java arrays list collections arraylist


【解决方案1】:

如何使用单独的数组并在循环中为列表中的相应值分配每个数组的值?

for (i = 0; i<= 5; i++) {
var [i] = myArrayList.indexOf(i);
}

【讨论】:

  • 这是一个明智的问题,基本上是问为什么它们需要在五个单独的变量中开始。
【解决方案2】:

描述的设计看起来真的很丑。不过,您可以将三元运算符用于所需目的:

var1 = myArrayList.size() > 0 ? myArrayList.get(0) : "null";

【讨论】:

    【解决方案3】:

    我同意 Voo 的观点,这很可能是由于糟糕的代码设计造成的。但这对我来说是一个展示我对最终变量和三元表达式的热爱的机会。 :-) 这个怎么样? (对于 yuks,我假设是字符串的 ArrayList。)

    final Iterator<String> iter = myArrayList.iterator();
    final String var1 = iter.hasNext() ? iter.next() : null;
    final String var2 = iter.hasNext() ? iter.next() : null;
    final String var3 = iter.hasNext() ? iter.next() : null;
    final String var4 = iter.hasNext() ? iter.next() : null;
    final String var5 = iter.hasNext() ? iter.next() : null;
    

    【讨论】:

      【解决方案4】:

      最简单的方法是:

      Object[] vars = myArrayList.toArray(new Object[5]);
      

      如果您坚持使用变量 var1 到 var5 而不仅仅是使用数组元素,请将数组元素复制到变量中。或者,您可以将“= varN”代码中的所有实例替换为“=myArrayList.get(n)”。

      【讨论】:

        【解决方案5】:

        这肯定是一个糟糕的代码设计。如果arraylist不包含该字段(毕竟你以后使用它),你还初始化变量是什么?一个更大的例子或者你正在尝试做的事情会在这里有所帮助。通常只使用

        但我至少可以想到两种方法:

            switch(myArrayList.size()) {
            case 5:
                var4 = myArrayList.get(4);
            case 4:
                var3 = myArrayList.get(3);
            case 3:
                var2 = myArrayList.get(2);
                    // and so on
            }
        

        或者只是使用 try/catch。

            try {
                var0 = myArrayList.get(0);
                var1 = myArrayList.get(1);
            }
            catch(IndexOutOfBoundsException ex){
            }
        

        但毫无疑问,最好使用 arraylist 本身,并使用您原本用于变量的默认值来填充它。

        【讨论】:

        • 谢谢,我只是想知道 Java 是否有办法做到这一点,但我猜不是
        • 不会投反对票,因为您的第一部分很有用,但我绝不会向某人推荐他们使用 try/catch 来保护他们免受错误。例外应该就是:例外。您永远不应该运行某些东西并期望得到异常;相反,您只是为出现问题做好了准备。
        • @glowcoder 我希望你相信我,我不会提倡这两个版本;)但我希望我说得足够清楚,人们应该真正过度考虑整体方法而不是这样做。关于以这种方式使用异常:我同意它在 Java 中不是好的编码风格,但是也不完全推荐切换失败。是的,我对 10 次投票感到有些惊讶,恕我直言,我有更多有用的帖子,只有 1-2 - 嗯。
        • @Voo 我预料到了这一点,你的第一行说明了一切“这肯定是一个糟糕的代码设计”,你的最后一行也表明它们是~坏主意~,所以这就是为什么我没有看到任何反对投票的理由。我想可以说,任何只跳到代码而不阅读周围文本的人都应该遇到任何麻烦,因为他们在跳过的内容中被警告过。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-22
        • 2020-03-26
        • 2015-09-21
        • 2019-05-07
        • 1970-01-01
        • 2020-03-09
        相关资源
        最近更新 更多