【问题标题】:How to print duplicates in string array only once如何在字符串数组中只打印一次重复项
【发布时间】:2015-08-31 07:02:16
【问题描述】:

我有一个索引为 25 的字符串数组。我输入了 25 个元素,我试图显示它们,但是,我只希望元素列出一次,然后是出现次数。到目前为止,出现的次数是正确的,但数组的每次迭代仍然打印多次。我正在使用蛮力方法,因为我不能使用 ArrayList、Map 等。有没有人可以给我提示只打印一次元素的逻辑?方法如下:

    private void displayFlowers(String flowerPack[]) {
    // TODO: Display only the unique flowers along with a count of any duplicates
    /*
     * For example it should say
     * Roses - 7
     * Daffodils - 3
     * Violets - 5
     */
    for(int i = 0; i < flowerPack.length; i++) {
        int count = 0;
        for(int j = 0; j < flowerPack.length; j++) {
            if(flowerPack[i].equals(flowerPack[j]))
            {
                count++;
            }
        }
        System.out.println(flowerPack[i] + " - " + count);
    }

这里是输出,看看我在说什么:

    rose - 6
    daffodil - 2
    rose - 6
    daisy - 3
    tulip - 2
    wildflower - 3
    lily - 3
    lily - 3
    daisy - 3
    rose - 6
    wildflower - 3
    rose - 6
    lilac - 1
    daffodil - 2
    rose - 6
    lily - 3
    tulip - 2
    wildflower - 3
    daisy - 3
    rose - 6
    carnation - 1
    orchid - 1
    sunflower - 3
    sunflower - 3
    sunflower - 3
    1: Add an item to the pack.
    2: Remove an item from the pack.
    3: Sort the contents of the pack.
    4: Search for a flower.
    5: Display the flowers in the pack.
    0: Exit the flower pack interface.

是的,我输入了rose 6 次,但我只希望它显示为:

    rose - 6
    daffodil -2
    daisy - 3
    tulip - 2
    etc
    etc

我知道蛮力在实际生产中表现不佳,但我们正在学习如何手动强制输出,即使它是 O(n^2) 复杂度。稍后我们将进入更快的内容。

【问题讨论】:

  • 为什么不能使用ArrayListMap 等? Set 听起来正是您想要的。
  • 两个提示:(1)您应该在外循环的索引 + 1 处开始内循环。(2)使用另一个(布尔)数组来跟踪您计算过的花朵。
  • 对不起,我没有提到 Set。我们还没有走到那一步,所以我们仅限于我们目前的知识范围。
  • 如果有人要否决他的问题,也许他们可以有礼貌地解释为什么这样做?
  • @luane:我在下面的回答中阐述了这个想法,但不鼓励或提及在当前索引之外的索引处启动计数循环的优化,因为这不是实现正确的必要条件输出并可能会混淆 OP。

标签: java arrays string duplicates


【解决方案1】:

如果您只使用原始数组,请创建第二个数组,称为 uniques,每次遇到新值时,通过向其添加新值来扩展该数组。当您遍历flowerPack 中的每个索引时,遍历uniques 以查看它是否已经包含当前索引的值。如果是这样,什么都不做,否则添加它。最后就可以打印出uniques的内容了。

【讨论】:

    【解决方案2】:

    既然您已经说过您不能使用任何库类,并且想要坚持您的基本方法,那么您可以进行一些小改动,以便只打印一次给定类型的花。它还可以为您节省一点计算量。基本上,有一个辅助布尔数组,您可以在其中跟踪您是否已经打印了在索引处包含花朵的数据。

    您通过 cmets 表达了对booleans 的一些不确定性。 boolean 只是 truefalse 的表示。数组是一种将单一类型的多个值保存在一起的一种方式,这些值具有与这些值相关联的一些顺序。在我的解决方案中,想法是您有第二个数组,其中布尔数组的索引(表示您关心的数组中的哪个项目的数值)用于对应于花数组的索引。所以布尔数组中的0项对应于String数组中的0项,1项对应于1项,n项对应于n项等。

    你可以用这个布尔数组来表示你是否在索引n处打印了花的类型信息。

    注意:已删除解决方案的实际代码,以便通过自己弄清楚细节来鼓励学习。祝你好运!

    【讨论】:

    • 我看到布尔数组在做什么。我还没有使用过这种形式的数组,但我知道你会用它去哪里;但是,我仍然难以理解布尔值。我知道它们是真还是假,是或否,1 或 0 等等,我只是想了解如何在我的代码中实际实现它们。
    • boolean 只是truefalse 的表示。数组是一种将单一类型的多个值保存在一起的一种方式,这些值具有与这些值相关联的一些顺序。在我的解决方案中,想法是您有第二个数组,其中布尔数组的索引(表示您关心的数组中的哪个项目的数值)用于对应于花数组的索引。所以布尔数组中的0项对应于String数组中的0项,1项对应于1项,n项对应于n项等。
    • 你可以使用这个布尔数组来表示你是否打印了索引n处的花卉类型信息。
    • @augray--支持正确的态度--删除代码(你已经写过最好的答案)以鼓励学习。加上一个很好的补充评论。
    【解决方案3】:

    为了让您的代码尽可能保持原样,我会创建一个像这样的新变量:

    private static void displayFlowers(String flowerPack[]) {
        // TODO: Display only the unique flowers along with a count of any duplicates
        /*
         * For example it should say
         * Roses - 7
         * Daffodils - 3
         * Violets - 5
         */
        int isChecked[] = new int[flowerPack.length];
    
        for(int i = 0; i < flowerPack.length; i++) {
            int count = 0;    
            for(int j = 0; j < flowerPack.length; j++) {
                if(flowerPack[i].equals(flowerPack[j]))
                {
                    count++;
                    if(i!=j)isChecked[j] = 1;
                }
            }
        if(isChecked[i]==0)
            System.out.println(flowerPack[i] + " - " + count);
        }
      }
    

    带数组:String []flowers = new String[]{"rose","sunflower","rose","rose","sunflower","daisy","daisy"};

    打印出来:

    rose - 3 sunflower - 2 daisy - 2

    希望有帮助!!

    【讨论】:

      【解决方案4】:

      您希望打印每个单词一次,并且要在不使用Set 的情况下执行此操作,您可以确保仅在第一次次打印该单词,或最后时间,它发生了。我们先假设:

      • 循环单词:
        • 检查列表中是否存在单词较早
        • 如果没有:
          • 计算单词在列表中之后出现的次数。
          • 打印单词和计数(+1,因为您没有计算第一个单词本身)。

      【讨论】:

      • 将答案更改为不说“最佳”,因为这不是最有效的方法,但它是获得结果的有效方法。这是否回答了不言而喻的反对意见?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      相关资源
      最近更新 更多