为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Qyouu 2022-05-21 18:33:40
我正在尝试实现一个逻辑,其中一个数组包含许多名称不同的项目(产品)。尽管如此,产品可能具有相同的名称,因此我需要添加一个附加属性(大小)。我想这是一个简单的任务,但我目前的方法是重复的: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);}我对这些项目进行了一些调整,以使其更易于阅读。我现在面临的问题是,附加了大小的两个添加元素现在也再次附加了没有大小的元素。那么,一旦我添加了这两个元素,我该如何跳过它们呢?
查看完整描述

3 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

使用name产品的作为标识符是一个不好的方法。此外,假设您在 2 个产品具有相同名称时添加产品的尺寸。那么当产品的尺寸和名称相同时,你会怎么做?每个产品都需要有一个 id。


但是,要回答您的问题,您的问题是您只需要一个循环就使用了 2 个循环。只需使用 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恭敬地改变以适应你的代码。


查看完整回答
反对 回复 2022-05-21
?
不负相思意

TA贡献1777条经验 获得超10个赞

改变你的方法。

  • 首先按名称对它们进行分组(Map<String, List<Item>>例如)

  • 然后,对于映射中的每个条目,确定列表的大小是否 >1。如果是这样,请将额外信息添加到该列表的每个项目中。

  • 然后,迭代所有条目和所有列表,并将它们放回一个大列表中。


查看完整回答
反对 回复 2022-05-21
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

标记!由于buttons.add(new Button(items.getString(k); 在外部循环中,必须发生重复。至少如果你将该行放在else-clause中,它就不会出现。


实际上在这里,如果您不介意内存,我建议使用 HashMap() 将 items.getString(k) 对存储到 items.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());


查看完整回答
反对 回复 2022-05-21
  • 3 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信