【问题标题】:How to concatenate the correct number of duplicates into a string with for loops?如何使用 for 循环将正确数量的重复项连接成一个字符串?
【发布时间】:2020-03-16 11:28:28
【问题描述】:

我有一个包含重复对象的数组,比如说:[A, A, B, C]。使用 for 循环,我将重复项的名称连接到一个字符串中。我试过这个:

for (var i = 0; i < myArray.data.length - 1; i ++) {
  for (var j = i + 1; j < myArray.data.length; j ++) {
    if (myArray.data[i].id == myArray.data[j].id) {
      identicalObjects = identicalObjects + myArray.data[i].name + ", " + myArray.data[j].name;
    }
  }
}

这打印:“A,A”,这是正确的。但是,如果数组是 [A,A,A,B,C],它会打印“A,A,A,A,A,A”,这是不正确的,只有 3 个重复而不是 6。我不能只是剪切字符串,因为在某些情况下,不同的对象(具有不同的 id)作为重复项返回,我需要知道它们的名称才能知道它们到底是哪些。

我想到的一个解决方案是将名称存储在数组中,如果相同名称的数量大于 2,则将其他名称的数量减半,然后转换为字符串。还有什么更简单有效的方法吗?

【问题讨论】:

  • 你添加了两次myArray.data[i].name,试试identicalObjects += (identicalObjects ? ", " : "") + myArray.data[i].name

标签: javascript loops duplicates


【解决方案1】:

但是,如果数组是 [A, A, A, B, C],它会打印“A, A, A, A, A, A”

这是因为当 i = 0 和 j = 1 时,你得到一个匹配,且 sameObjects 设置为“A,A”。当 i = 0 和 j = 2 时,您会得到另一个匹配项,并将 sameObjects 设置为其先前的值加上“A,A”。然后,当 i = 1 和 j = 2 时,您会得到另一个匹配项并执行相同的连接。

为什么不使用Map 对象并使用该对象作为键,值是计数?

【讨论】:

  • 这不是真的,因为第二次迭代从i + 1 开始,只有在有 4 个或更多重复项后,OP 的方法才会开始失败。这是一个测试jsbin.com/gaxelenowe/edit?js,console
  • 我的意思不是算法找到 3 个匹配项,而是它为找到的每个匹配项打印“A,A”。所以当有 3 个匹配时,你得到 3 * "A, A"。
【解决方案2】:

这可能不是最直接的实现方式,但我认为它应该可以完成工作。

var uniqueLetters = myArray.filter(distinct);

for(var i = 0; i < uniqueLetters.length; i++){
    for(var j = 0; j < myArray.Length; j++){

        if(myArray.data[j] == uniqueLetters[i]){
            identicalObjects = identicalObjects + myArray.data[i].name + ", " + myArray.data[j].name;
        }
    }
}

所以,例如。假设您有一个数组 [A, A, B, C]。 uniqueLetters 将包含 [A, B, C]。然后遍历原始数组,检查不同的数组。

同样,这可能不是最直接的处理方式,但它应该可以工作。

【讨论】:

    【解决方案3】:

    如果将对象数组转换为 List 会更加简单灵活。 列表功能更强大,您可以使用列表做更多事情。

    在您的示例中,您尝试根据 id 查找重复项。使用列表,这可以在一个句子中实现。

    Map<Integer, List<YourObject>> yourObjectMap = empArray.stream().collect(Collectors.groupingBy(YourObject::getId));
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2014-08-02
      相关资源
      最近更新 更多