Java 增加出现次数而不是添加重复项的集合

Java 增加出现次数而不是添加重复项的集合,java,collections,Java,Collections,是否存在只存储唯一字符串的集合,但计算此字符串被添加的次数? 因此,每当我再次尝试添加相同的字符串/项时,项的数量保持不变,但给定项的出现次数将增加?据我所知,没有此类内置集合,但您可以通过使用映射集合: Map<String, Integer> map = new HashMap<>(); String sample = "foo"; if (map.containsKey(sample)) map.put(sample, map.get(sample) + 1

是否存在只存储唯一字符串的集合,但计算此字符串被添加的次数?
因此,每当我再次尝试添加相同的字符串/项时,项的数量保持不变,但给定项的出现次数将增加?

据我所知,没有此类内置集合,但您可以通过使用
映射
集合:

Map<String, Integer> map = new HashMap<>();
String sample = "foo";
if (map.containsKey(sample))
    map.put(sample, map.get(sample) + 1);
输出:

3

希望有帮助。

据我所知,没有内置的集合,但您可以通过使用
Map
collection:

Map<String, Integer> map = new HashMap<>();
String sample = "foo";
if (map.containsKey(sample))
    map.put(sample, map.get(sample) + 1);
输出:

3

希望有帮助。

您可以使用一个
HashMap
并在其周围包装一些代码:

public class CounterMap<K> {

    private final Map<K, Integer> internalMap = new HashMap<K, Integer>();

    public void increment(K key) {
        initKeyIfNew(key);
        Integer oldValue = internalMap.get(key);
        Integer newValue = oldValue + 1;

        internalMap.put(key, newValue);
    }

    public int getCount(K key) {
        initKeyIfNew(key);
        return internalMap.get(key);
    }

    private void initKeyIfNew(K key) {
        if (internalMap.get(key) == null) {
            internalMap.put(key, 0);
        }
    }

}
公共类计数器映射{
私有最终映射internalMap=新HashMap();
公共无效增量(K键){
initKeyIfNew(key);
整数oldValue=internalMap.get(键);
整数newValue=oldValue+1;
internalMap.put(key,newValue);
}
公共整数getCount(K键){
initKeyIfNew(key);
返回internalMap.get(key);
}
私有void initKeyIfNew(K密钥){
if(internalMap.get(key)==null){
internalMap.put(键,0);
}
}
}
然后你可以这样使用它:

    CounterMap<String> myCounterMap = new CounterMap<String>();
    myCounterMap.increment("hello");
    ...
CounterMap myCounterMap=new CounterMap();
myCounterMap.increment(“你好”);
...

您可以使用
HashMap
并在其周围包装一些代码:

public class CounterMap<K> {

    private final Map<K, Integer> internalMap = new HashMap<K, Integer>();

    public void increment(K key) {
        initKeyIfNew(key);
        Integer oldValue = internalMap.get(key);
        Integer newValue = oldValue + 1;

        internalMap.put(key, newValue);
    }

    public int getCount(K key) {
        initKeyIfNew(key);
        return internalMap.get(key);
    }

    private void initKeyIfNew(K key) {
        if (internalMap.get(key) == null) {
            internalMap.put(key, 0);
        }
    }

}
公共类计数器映射{
私有最终映射internalMap=新HashMap();
公共无效增量(K键){
initKeyIfNew(key);
整数oldValue=internalMap.get(键);
整数newValue=oldValue+1;
internalMap.put(key,newValue);
}
公共整数getCount(K键){
initKeyIfNew(key);
返回internalMap.get(key);
}
私有void initKeyIfNew(K密钥){
if(internalMap.get(key)==null){
internalMap.put(键,0);
}
}
}
然后你可以这样使用它:

    CounterMap<String> myCounterMap = new CounterMap<String>();
    myCounterMap.increment("hello");
    ...
CounterMap myCounterMap=new CounterMap();
myCounterMap.increment(“你好”);
...
使用Java 8:

 Map<String, Integer> map = new HashMap<>();
这样做的目的是添加字符串
s
,并将该值设置为
1
,如果该值还不存在。如果它已经存在,那么它将获取当前值和您要添加的新值(再次为1)并将它们相加,然后将它们放回映射中。

使用Java 8:

 Map<String, Integer> map = new HashMap<>();
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class UniqueStringCount {

    public static void main(String[] args) {

        boolean takeUserInput = true;
        HashMap<String, Integer> uniqueStringMap = new HashMap<>();
        int counter = 0;

        System.out.println("Welcome. To close the program type exit.");
        System.out.println();

        do {
            Scanner scan = new Scanner(System.in);

            System.out.println("Enter the unique string");

            String userInput = scan.next();

            if(userInput.equalsIgnoreCase("exit")) {
                takeUserInput = false;
                scan.close();
            }

            System.out.println();

            if(!userInput.equalsIgnoreCase("exit")) {

                if(uniqueStringMap.containsKey(userInput)) {
                    counter = uniqueStringMap.get(userInput);
                    uniqueStringMap.put(userInput, ++counter);
                    continue;
                }

                counter = 0;
                uniqueStringMap.put(userInput, ++counter);
            }

        } while(takeUserInput);

        if(!uniqueStringMap.isEmpty()) {
            for(Map.Entry<String, Integer> entry : uniqueStringMap.entrySet()) {
                System.out.println("String " + entry.getKey() + " was added " + entry.getValue() + " times.");
                System.out.println();
            }
            System.out.println("Bye bye.");
        }
    }
}
这样做的目的是添加字符串
s
,并将该值设置为
1
,如果该值还不存在。如果它已经存在,那么它将获取当前值和正在添加的新值(再次为1)并将它们相加,然后将其放回映射中。

import java.util.HashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class UniqueStringCount {

    public static void main(String[] args) {

        boolean takeUserInput = true;
        HashMap<String, Integer> uniqueStringMap = new HashMap<>();
        int counter = 0;

        System.out.println("Welcome. To close the program type exit.");
        System.out.println();

        do {
            Scanner scan = new Scanner(System.in);

            System.out.println("Enter the unique string");

            String userInput = scan.next();

            if(userInput.equalsIgnoreCase("exit")) {
                takeUserInput = false;
                scan.close();
            }

            System.out.println();

            if(!userInput.equalsIgnoreCase("exit")) {

                if(uniqueStringMap.containsKey(userInput)) {
                    counter = uniqueStringMap.get(userInput);
                    uniqueStringMap.put(userInput, ++counter);
                    continue;
                }

                counter = 0;
                uniqueStringMap.put(userInput, ++counter);
            }

        } while(takeUserInput);

        if(!uniqueStringMap.isEmpty()) {
            for(Map.Entry<String, Integer> entry : uniqueStringMap.entrySet()) {
                System.out.println("String " + entry.getKey() + " was added " + entry.getValue() + " times.");
                System.out.println();
            }
            System.out.println("Bye bye.");
        }
    }
}
导入java.util.Map; 导入java.util.Scanner; 公共类UniqueStringCount{ 公共静态void main(字符串[]args){ 布尔takeUserInput=true; HashMap uniqueStringMap=新HashMap(); int计数器=0; System.out.println(“欢迎。关闭程序类型exit”); System.out.println(); 做{ 扫描仪扫描=新扫描仪(System.in); System.out.println(“输入唯一字符串”); 字符串userInput=scan.next(); if(userInput.equalsIgnoreCase(“退出”)){ takeUserInput=false; scan.close(); } System.out.println(); 如果(!userInput.equalsIgnoreCase(“退出”)){ if(uniqueStringMap.containsKey(用户输入)){ 计数器=uniqueStringMap.get(userInput); uniqueStringMap.put(用户输入,+计数器); 继续; } 计数器=0; uniqueStringMap.put(用户输入,+计数器); } }while(takeUserInput); 如果(!uniqueStringMap.isEmpty()){ 对于(Map.Entry:uniqueStringMap.entrySet()){ System.out.println(“字符串”+entry.getKey()+“被添加”+entry.getValue()+“次”); System.out.println(); } System.out.println(“再见”); } } }
导入java.util.HashMap;
导入java.util.Map;
导入java.util.Scanner;
公共类UniqueStringCount{
公共静态void main(字符串[]args){
布尔takeUserInput=true;
HashMap uniqueStringMap=新HashMap();
int计数器=0;
System.out.println(“欢迎。关闭程序类型exit”);
System.out.println();
做{
扫描仪扫描=新扫描仪(System.in);
System.out.println(“输入唯一字符串”);
字符串userInput=scan.next();
if(userInput.equalsIgnoreCase(“退出”)){
takeUserInput=false;
scan.close();
}
System.out.println();
如果(!userInput.equalsIgnoreCase(“退出”)){
if(uniqueStringMap.containsKey(用户输入)){
计数器=uniqueStringMap.get(userInput);
uniqueStringMap.put(用户输入,+计数器);
继续;
}
计数器=0;
uniqueStringMap.put(用户输入,+计数器);
}
}while(takeUserInput);
如果(!uniqueStringMap.isEmpty()){
对于(Map.Entry:uniqueStringMap.entrySet()){
System.out.println(“字符串”+entry.getKey()+“被添加”+entry.getValue()+“次”);
System.out.println();
}
System.out.println(“再见”);
}
}
}

类似于@luk2302 CountedSet的内容被重新声明,更好的解决方案是使用Google Guavosomething中的Multiset,类似于@luk2302 CountedSet的内容被重新声明,更好的解决方案是使用Google Guava中的Multiset