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

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


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);

}

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


Qyouu
浏览 84回答 3
3回答

眼眸繁星

使用name产品的作为标识符是一个不好的方法。此外,假设您在 2 个产品具有相同名称时添加产品的尺寸。那么当产品的尺寸和名称相同时,你会怎么做?每个产品都需要有一个 id。但是,要回答您的问题,您的问题是您只需要一个循环就使用了 2 个循环。只需使用 if 语句来检查两个产品是否在一个 for 循环中具有相同的名称。for (int k = 0; k < items.length(); k++) {&nbsp;if(k == items.length() - 1{&nbsp; &nbsp; //Last Entry in for loop, don't add anything here or you'll get a null pointer exception&nbsp; }&nbsp;else{&nbsp; &nbsp; if(items[k].productName.equals(items[k+1].productName){&nbsp; &nbsp; &nbsp; //2 Products have same name! Do your stuff.&nbsp; &nbsp; }&nbsp; }}&nbsp;你从来没有指定什么item是items[].productName恭敬地改变以适应你的代码。

不负相思意

改变你的方法。首先按名称对它们进行分组(Map<String, List<Item>>例如)然后,对于映射中的每个条目,确定列表的大小是否 >1。如果是这样,请将额外信息添加到该列表的每个项目中。然后,迭代所有条目和所有列表,并将它们放回一个大列表中。

慕侠2389804

标记!由于buttons.add(new Button(items.getString(k); 在外部循环中,必须发生重复。至少如果你将该行放在else-clause中,它就不会出现。实际上在这里,如果您不介意内存,我建议使用 HashMap() 将 items.getString(k) 对存储到 items.getJSONObject(k).getString("size") 的列表中。然后你通过集合去创建这个哈希图:for(int k = 0;....){&nbsp; &nbsp;String key = items.getString(k);&nbsp; &nbsp;if(map.contains(key){&nbsp; &nbsp; &nbsp; map.get(key).add(items.getJSONObject(k));&nbsp; &nbsp;else {&nbsp; &nbsp; &nbsp;List<?> list = new ArrayList()&nbsp; &nbsp; &nbsp;list.add(items.getJSONObject(k));&nbsp; &nbsp; &nbsp;map.put(key, list);&nbsp; &nbsp;}}map.entrySet().stream().map(stringListEntry -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (stringListEntry.getValue().size() == 1) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return new Button(stringListEntry.getKey());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return stringListEntry.getValue().stream().map(size ->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new Button(stringListEntry.getKey() + " Größe " + size));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp;}).collect(Collectors.toList());
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java