【问题标题】:Java Counting unique values in a queueJava计算队列中的唯一值
【发布时间】:2015-01-02 10:27:13
【问题描述】:
int uniqueCount = 0;
System.out.println("List Cities Visited:");

for(int i = 0; i < num; i++)
{
    System.out.println((i+1)+". "+(String)cityTrack.dequeue());

}

System.out.println("Unique Cities: "+uniqueCount);

基本上,我将城市列表添加到队列中。我要把它打印出来,如上图所示,并计算出独特城市的数量。有任何想法吗?我对此很陌生。

编辑:已解决。谢谢大家!

【问题讨论】:

  • 如果您将城市添加到集合中。那么答案就是 Set 的大小。否则,您仍然可以在 for 循环中使用 Set 来解决问题。

标签: java count queue unique


【解决方案1】:

随着 Java 8 的出现,流 API:s 支持distinct-方法。可以使用以下代码:

Collection<String> cities = new ArrayDeque<>();
cities.add("Detroit");
cities.add("NYC");
cities.add("Boston");
cities.add("Boston");

// Count the number of unique cities
final long uniqueCities = cities.stream().distinct().count();

// Prints all of the cities (including duplicates) and removes them from the 
// queue (i.e. performs a dequeue) which is the same way as you showed in the example
IntStream.rangeClosed(1, cities.size())
        .forEach(i -> System.out.println(i + ". " + cities.remove()));

// Prints the unique cities counter
System.out.println("Unique: " + uniqueCities); // -> Unique: 3

distinct-方法要求正确实现 hashCode-方法(它已经适用于 String 类)。

资源:

提示,如果您需要创建自己的哈希,Objects.hash 方法可以正常工作。您只需传递应该是 hashCode 一部分的参数。

public int hashCode() {
    return Objects.hash(attr1, attr2, attr3);
}

另外,请注意,通过使用remove-方法(与您的示例中的dequeue 相同),将从队列中删除元素。如果这不是本意,那么一个带有计数器的简单循环就可以了,如下例所示:

AtomicInteger counter = new AtomicInteger(0);
cities.stream()
        .map(city -> counter.incrementAndGet() + ". " + city)
        .forEach(System.out::println);

【讨论】:

    【解决方案2】:

    ....并计算独特城市的数量.....

    你可以在这里使用Set,因为它只包含独特的元素。

    举例

        Queue<Integer> queue = new LinkedList<Integer>();
        queue.add(1);
        queue.add(1);
        queue.add(1);
        Set<Integer> set = new HashSet<Integer>();
        set.addAll(queue);
        System.out.println(set.size());
    

    输出

    1
    

    【讨论】:

      【解决方案3】:

      就像您在代码中提到的那样。创建一个名为例如的临时队列uniqueCityTrack 并检查您已检查和输入的每个。

      int uniqueCount = 0;
      System.out.println("List Cities Visited:");
      CityTrack uniqueCityTrack = new CityTrack();
      for(int i = 0; i < num; i++)
      {
          System.out.println((i+1)+". "+(String)cityTrack.dequeue());
          while(uniqueCityTrack.hasNext){
              if(!uniqueCityTrack.contain((String)cityTrack.dequeue()){
                  uniqueCount++;
              }
          }
      uniqueCityTrack.enqueue((String)cityTrack.dequeue());
      }
      
      System.out.println("Unique Cities: "+uniqueCount);
      

      【讨论】:

      • while(uniqueCityTrack.hasNext) 不幸的是,在我将上面的代码更改为我的代码需要后,我意识到 .hasNext 不起作用。我正在使用 netbeans IDE 是否有另一种编写 uniqueCityTrack.hasNext 的方法?
      • 您使用的是哪个队列?
      • 我的课程老师提供的队列课程。她说里面没有hasNext方法。但没关系,我通过使用收集频率解决了这个问题。我个人一开始并不喜欢它。
      【解决方案4】:

      将它们添加到 HashSet 并获取大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多