【问题标题】:Set counting items设置计数项目
【发布时间】:2018-04-29 12:35:27
【问题描述】:

我想知道一个集合中是否有任何java集合计数发生。

由于它只存储一次引用并获取添加的次数,因此可以节省空间,但可以让您知道添加的次数。 如果您需要知道是否有可用项目,它还可以节省空间。

例如:

Set<Object> counterSet = new Set<Object>();

counterSet.add("Hello");
counterSet.add("world");
counterSet.add("Hello");

counterSet.numberOfInstances("Hello"); //returns 2
counterSet.numberOfInstances("world"); //returns 1

我一直在寻找它,但我没有找到这样的集合,你能告诉我最好的方法吗?

【问题讨论】:

  • 使用HashMap&lt;Object,Integer&gt;
  • 你可以这样做,但是你必须检查HashMap是否包含密钥,这是我这样做的方式,但我想知道是否有更优雅的方式来做到这一点。
  • 如果集合中没有对象,您的虚构方法numberOfInstances 将如何响应?
  • @Seelenvirtuose 它会返回 0
  • 你可以在这里找到一些使用地图的解决方案:stackoverflow.com/questions/49790737

标签: java collections set


【解决方案1】:

Set 不允许重复。而是考虑使用Map&lt;String, Integer&gt;List&lt;String&gt;,然后使用Collections.frequency 来获取计数。

【讨论】:

    【解决方案2】:

    您可以使用Apache Commons Collections 中的MultiSet

    定义一个集合,计算对象在集合中出现的次数。 假设您有一个包含 {a, a, b, c} 的 MultiSet。在 a 上调​​用 getCount(Object) 将返回 2,而调用 uniqueSet() 将返回 {a, b, c}。

    看这个例子:

    public class MultiSetTest {
        @Test
        public void testMultiSet(){
            MultiSet<String> counterSet = new HashMultiSet<>();
            counterSet.add("Hello");
            counterSet.add("world");
            counterSet.add("Hello");
    
            Assert.assertEquals(2, counterSet.getCount("Hello"));
            Assert.assertEquals(1, counterSet.getCount("world"));
            Assert.assertEquals(0, counterSet.getCount("somethingMissing"));
        }
    }
    

    【讨论】:

    • 如果你做 couterSet.getCount("newString");它返回 0?
    • @DavidMarciel 是的。感谢您的建议,我已经为这个案例添加了断言。
    【解决方案3】:

    您可以使用Eclipse Collections 中的Bag 类型:

    Bag<String> bag = Bags.mutable.with("Hello", "world", "Hello");
    Assert.assertEquals(2, bag.occurrencesOf("Hello"));
    Assert.assertEquals(1, bag.occurrencesOf("world"));
    

    注意:我是 Eclipse Collections 的提交者。

    【讨论】:

      猜你喜欢
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      相关资源
      最近更新 更多