在屏幕上打印一个重复循环

时间:2016-09-22 17:59:37

标签: java arraylist

我的Java类中有一个重复的结构,并希望按如下方式显示数据:

Peter Black
John Red

我不知道结构是否正确,因为如果我离开只显示颜色,数据会被覆盖

public class Test {

    public static void main(String[] args) {
        List<Person> persons = new ArrayList<>();

        String[] names= {"Peter", "John"};
        String[] colors= {"Black", "Red"};

        for (String name: names) {
            Person d = new Person();

            d.setName(name);

            for (String color: colors) {
                d.setColor(color);
            }
            persons.add(d);
        }

        for (Person a : persons) {
            System.out.println(a.getName() + "-" + a.getColor());
        }
    }
}

控制台:

Peter-Red
John-Red

4 个答案:

答案 0 :(得分:1)

不是使用嵌套的for循环,而不是你想要完成的循环,而是同时遍历两个数组。

if (names.length != colors.length) {
    // error! not a 1:1 relationship
    return;
}
for (int i = 0; i < names.length && i < colors.length; i++) {
    String name = names[i], color = colors[i];
    Person d = new Person();
    d.setName(name);
    d.setColor(color);
    persons.add(d);
}

我可以做i < names.length,但是如果两个数组的大小不同,那么这将会中断,因此i < names.length && i < colors.length将确保i永远不会超过两个数组中的任何一个。长度。

修改 我认为这里真正的问题是你如何存储你的信息。为什么使用两个字符串数组而不是包含Person对象的集合?

答案 1 :(得分:1)

停止循环使用名称循环中的颜色数组。传统的基于索引的循环应该可以帮助您从每个数组中获得相同的名称和颜色:

public class Test {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        List<Person> persons = new ArrayList<>();

        String[] names= {"Peter", "John"};
        String[] colors= {"Black", "Red"};

        for (int i=0; i<names.length; i++) {
            Person d = new Person();
            d.setName(names[i]);
            d.setColor(colors[i]);
            persons.add(d);
        }

        for (Person a : persons) {
            System.out.println(a.getName() + "-" + a.getColor());
        }
    }
}

答案 2 :(得分:0)

请注意,您的颜色循环位于您的名称循环中。因此,对于每个名称,您将其颜色设置为第一种颜色,然后是第二种颜色,然后您将转到下一个名称。

你最大的问题可能是使用高级for循环,它没有给你一个索引。如果您从:

开头
for(int i=0;i<names.length;i++) 

解决方案可能很明显(并简化您的代码)

(我会给予更多,但它看起来像你正在尝试学习的东西所以我会尽量避免破坏者)

重新评论 - 如果您只想创建完全填好的对象,请使用

for(int i=0;i<Math.min(names.length, colors.length);i++)

如果要创建部分对象,请使用Math.max并处理数组长度小于i的情况。这是所有业务逻辑代码......定义你想要做的事情并做到这一点。

如何处理错误数据(不是原始问题的一部分):

如果你想处理数组不相等的情况,如果你使用上面的“Math.max”解决方案,那么添加循环内部可能如下所示:

if(names.length < i)
   d.setName(names[i])
if(colors.length < i)
   d.setColor(colors[i])

这种方式没有例外,您可以安全地设置值。

但是,由于这会使您的对象无效,您可能最好不要让用户使用不同数量的颜色和名称。如果他输入3个名字,然后扔掉空白颜色并继续重新提示,直到你有3种颜色 - 然后停止提示。尽快发现这样的问题总是最安全的。

另一个好的解决方案,从:

开始
if(names.length != colors.length)
    throw new IllegalArgumentException("createUsers method must have the same number of names as colors but was called with "+names.length+" names and "+colors.length+" colors")

确保你的参数是正确的,并且如果它们没有简化你的代码就会引发异常并且通常是一种非常好的做法。

答案 3 :(得分:0)

您可以使用Enum赞

enum Entity {
        Peter("Black"),
        John("Red");

        private final String color;

        Entity(String color) {
            this.color = color;
        }