在数组中查找等于并添加其他信息

时间:2019-01-24 09:42:28

标签: java arrays for-loop

我正在尝试实现一种逻辑,其中数组包含许多名称不同的项目(产品)。但是,产品名称可能相同,因此我需要添加一个附加属性(大小)。我想这是一个简单的任务,但是我在当前的方法中得到了重复:

for (int k = 0; k < items.length(); k++) {
 for (int l = k + 1; l < items.length(); l++) {
  if(items.getString(k).equals(items.getString(l))) {
    buttons.add(new Button(items.getString(k) + " Größe "
                            + items.getJSONObject(k).getString("size");

    buttons.add(new Button(items.getString(l) + " Größe "
                            + items.getJSONObject(l).getString("size");
  }
 }
 buttons.add(new Button(items.getString(k);
}

我对项目进行了一些修改,以使其更易于阅读。我现在面临的问题是,添加了两个附加大小的元素现在也再次附加了没有大小的元素。那么一旦添加了这两个元素,该如何跳过呢?

4 个答案:

答案 0 :(得分:0)

改变方法。

  • 首先按名称分组(例如../../uploads/
  • 然后,对于地图中的每个条目,确定列表的大小是否大于1。如果是这样,请将额外信息添加到该列表的每个项目中。
  • 然后,迭代所有条目和所有列表,并将它们放回到大列表中。

答案 1 :(得分:0)

似乎您要添加按钮的次数是三次,而不是两次。

因为您要遍历两个嵌套循环。您无需在嵌套循环中为k索引添加:

我认为您需要删除此行:

buttons.add(new Button(items.getString(k) + " Größe " + items.getJSONObject(k).getString("size");

您还可以设置setWidth()setHeight()之类的按钮的大小

最后应该如下所示:

for (int k = 0; k < items.length(); k++) {
 for (int l = k + 1; l < items.length(); l++) {
  if(items.getString(k).equals(items.getString())) {
    Button button1 = new Button(items.getString(l) + " Größe " + items.getJSONObject(l).getString("size");
    button1.setWidth(200);
    button1.setHeight(100);
    buttons.add(button1);
  }
 }
 Button button2 = new Button(items.getString(k);
 button2.setWidth(200);
 button2.setHeight(100);
 buttons.add(button2);
}

答案 2 :(得分:0)

将产品的name用作标识符是一种不好的方法。另外,假设您在两个产品具有相同名称时确实增加了产品尺寸。那么,当产品具有相同的尺寸和名称时,该怎么办?每个产品都需要有一个ID。

但是,要回答您的问题,您的问题是,当您只需要一个循环时,您正在使用2个for循环。只需使用if语句来检查两个产品在for循环中是否具有相同的名称。

for (int k = 0; k < items.length(); k++) {
 if(k == items.length() - 1{
    //Last Entry in for loop, don't add anything here or you'll get a null pointer exception
  }
 else{
    if(items[k].productName.equals(items[k+1].productName){
      //2 Products have same name! Do your stuff.
    }
  }

} 

您从来没有指定item是什么,因此请相应更改items[].productName以适应您的代码。

答案 3 :(得分:0)

马克! 由于外部循环中的button.add(new Button(items.getString(k);),因此必须发生重复。 至少如果您将该行放在else-clause中,它将不会显示。

实际上,在这里,如果您不介意内存,我建议您使用HashMap()存储对项。getString(k)到项列表。getJSONObject(k).getString(“ size “)。

然后您一次遍历集合以创建此哈希图:

for(int k = 0;....){
   String key = items.getString(k);
   if(map.contains(key){
      map.get(key).add(items.getJSONObject(k));
   else {
     List<?> list = new ArrayList()
     list.add(items.getJSONObject(k));
     map.put(key, list);
   }
}

map.entrySet().stream().map(stringListEntry -> {
         if (stringListEntry.getValue().size() == 1) {
              return new Button(stringListEntry.getKey());
         } else {
             return stringListEntry.getValue().stream().map(size ->
                       new Button(stringListEntry.getKey() + " Größe " + size));
         }
     }).collect(Collectors.toList());