2016-09-22 62 views
0

我有一个重复结构在我的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 
+0

你是如何映射名称的颜色?有没有任何模式?或者它是一对一的映射? –

+0

@DeendayalGarg是1:1 – AmandaRJ

+0

@AmandaRJ抱歉,如果我不明白,但为什么你使用两个字符串数组,而不是仅仅添加到“人”列表? – MCMastery

回答

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对象的集合?

+0

Show!太棒了!!! – AmandaRJ

0

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

你最大的问题可能是使用先进的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") 

确保您的参数是正确的,并抛出一个异常,如果他们不简化你的代码了很多,通常是一个很好的做法。

+0

与拉斐尔的回答相同的问题上面的 – MCMastery

+0

顺便说一句,你是编码他们必须是相同的大小。如果你需要处理不同大小的数组,那么你必须定义你希望在这种情况下做什么,并为它编写异常代码。 (如果第二个数组更短,测试结果是否会抛出或者Person是否获得无效的颜色?如果颜色更长,代码会抛出,您丢弃最后一个值,或者创建一个没有名称的人。必须考虑例外,无论您的解决方案是什么,并且在您的示例中您没有真正解决它们。 –

+0

是的,我明白,但是如果用户提供此信息会怎么样? – MCMastery

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()); 
     } 
    } 
} 
+0

这会中断,并抛出一个ArrayIndexOutOf BoundsException如果两个数组的大小不同 – MCMastery

+0

的确如此。但他们不是。它看起来像这些begginers实践的挑战,认为在不同的阵列中分享相同索引的人员特征。 –

0

可以使用枚举像

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

     private final String color; 

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

如果您要使用枚举,我会将Person更改为一个接口并使枚举实现Person – MCMastery

+0

是的,这将是一个更好的设计。 –

+0

@Ankushsoni我不能。这个测试是为了将数据包含在我的数据库中。我有一个表格,数据来自它。我得到一个字符串列表。 – AmandaRJ