【问题标题】:How to initiate counter when new item is added添加新项目时如何启动计数器
【发布时间】:2015-08-31 13:02:09
【问题描述】:

我有如下所示的数组

public static void main(String[] args) {
    List asList = Arrays.asList("banner","carousel","banner","carousel","banner");
    Set<String> mySet = new HashSet<String>(asList);
    for(String s: mySet){

     System.out.println(s + " " +Collections.frequency(asList,s));

    }

}

输出:

carousel 2
banner 3

期望输出:

banner0
carousel0
banner1
carousel1
banner2

请让我知道在这种情况下需要做什么。

【问题讨论】:

  • 在您的代码 sn-p 中没有计数器。什么意思?
  • 如果您需要维护插入顺序,List 似乎比 Set 更合适。
  • 有许多不同的方法可以实现您正在寻找的功能,请考虑将您的for-each 循环修改为带有迭代器的标准for 循环。您可以考虑使用 if 条件并在外部 for 循环中添加另一个循环。
  • 我会使用 HashMap 来记住字符串元素的当前计数,并每次增加它。但是,这看起来像是学校/大学的作业,只为您编写代码是错误的。

标签: java arrays counter


【解决方案1】:

你需要做一个简单的改变:这里我们做一个子列表,它只计算到当前循环项目。

public static void main(String[] args) {
        List asList = Arrays.asList("banner", "carousel", "banner", "carousel", "banner");
        for(int i=0;i<asList.size();i++) {
            System.out.println(asList.get(i)+" : " + Collections.frequency(asList.subList(0,i), asList.get(i)));
        }
    }

输出:

banner : 0
carousel : 0
banner : 1
carousel : 1
banner : 2

【讨论】:

  • 我认为投反对票是因为解决方案效率很低。创建一个子列表并计算每次迭代的频率似乎是一个非常糟糕的设计选择恕我直言。
  • @Keppil 谢谢你的帮助。仅供参考,我不是每次都只使用切割清单来创建子清单。
  • @StackFlowed 你能帮帮我吗?我需要将这个带有增量键的地图放入如下:0 :banner 0: carousel 1: banner 1: carousel 2: banner
  • @MananKapoor 请创建一个新问题......因为这个解决方案回答了这个问题。
【解决方案2】:

您可以简单地包装add方法来打印添加之前的频率写入:

List<String> asList = Arrays.asList("banner", "carousel", "banner", "carousel", 
                                   "banner");
// ...
Set<String> mySet = new HashSet<>();
for(String s : asList) {
    addAndPrint(s, mySet);
}

private static final addAndPrint(String s, Collectection<String> c) {
    System.out.println(s + " " + Collections.frequency(c, s));
    c.add(s);
}

【讨论】:

    【解决方案3】:

    可以通过使用地图来实现:

       public static void main(String[] args)
        {
            final List<String> asList = Arrays.asList("banner", "carousel", "banner", "carousel", "banner");
            final Map<String, Integer> map = new HashMap<String, Integer>();
    
            for (final String s : asList)
            {
    
                if (!map.containsKey(s))
                {
                    map.put(s, 0);
                }
                else
                {
                    map.put(s, map.get(s) + 1);
                }
                System.out.println(s + " " + map.get(s));
            }
    
        }
    

    【讨论】:

      【解决方案4】:

      尝试使用迭代器和 std for 循环而不是自定义集。如果您总是将“旋转木马”和“横幅”作为项目,则声明两个计数器并在遇到它们时遇到它们。下面是一个sn-p

       List asList = Arrays.asList("banner","carousel","banner","carousel","banner");
              int countb = 0;
              int countc = 0;
              for (int i = 0; i < asList.size(); i++) {
                  if (asList.get(i).equals("banner")) {
                      countb++;
                      System.out.print("banner"+countb+"\n");
                  } else if (asList.get(i).equals("carousel")) {
                      countc++;
                      System.out.print("carousel"+countc+"\n");
      
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 2021-03-18
        • 1970-01-01
        相关资源
        最近更新 更多