Java 我可以使用什么数据结构来计算国家代码的出现次数?

Java 我可以使用什么数据结构来计算国家代码的出现次数?,java,data-structures,Java,Data Structures,我需要某种数据结构,但不知道哪一种最合适 这里是我正在处理的:我有一堆数据处理行,每行都有自己的国家代码 我希望获得每个国家/地区代码在整个过程中重复的次数。使用国家/地区代码字符串作为键,当前计数作为值创建地图 当然,您会意识到,您可以直接从SQL查询中获得这样的结果: select country_code, count(country_code) from your_table group by country_code order by country_code 您将得到一个包含国家代

我需要某种数据结构,但不知道哪一种最合适

这里是我正在处理的:我有一堆数据处理行,每行都有自己的国家代码


我希望获得每个国家/地区代码在整个过程中重复的次数。

使用国家/地区代码字符串作为键,当前计数作为值创建地图

当然,您会意识到,您可以直接从SQL查询中获得这样的结果:

select country_code, count(country_code)
from your_table
group by country_code
order by country_code

您将得到一个包含国家代码和计数对的结果集。这很容易加载到地图中。

我会使用HashMap,以国家代码为键,以计数为值。从您的收藏中构建地图,如果它已经在地图中,则增加计数。

您可以尝试一个新的方法。使用HashMap,您可以使用国家代码作为键,每个国家代码的显示次数作为存储在该键中的值。如果您第一次遇到特定的国家代码,请将其以初始值1插入地图;否则,增加现有值

HashMap<String, Integer> myMap = new HashMap<String, Integer>();

for (... record : records) {
    String countryCode = record.getCountryCode();

    int curVal;
    if (myMap.containsKey(countryCode)) {
        curVal = myMap.get(countryCode);
        myMap.put(countryCode, curVal + 1);
    } else {
        myMap.put(countryCode, 1);
    }
}

// myMap now contains the count of each country code, which
// can be used for whatever purpose needed.
HashMap myMap=newhashmap();
对于(…记录:记录){
字符串countryCode=record.getCountryCode();
int曲线;
if(myMap.containsKey(国家代码)){
curVal=myMap.get(countryCode);
myMap.put(countryCode,curVal+1);
}否则{
myMap.put(国家代码,1);
}
}
//myMap现在包含每个国家/地区代码的计数
//可以用于任何需要的目的。

以其他方式完成答案

  • 如果您的国家/地区代码列表是或可以很容易地转换为不太稀疏的数字序列,请尝试使用
    int[]
    long[]
  • 如果您的国家/地区代码范围很小,但元素不多,请创建一个
    CountryCode
    ,并使用存储金额:
示例:

Map<CountryCode, Long> countryCodeAppearances = 
       new EnumMap<CountryCode,Long>(CountryCode.class);
Map countrycode外观=
新的EnumMap(CountryCode.class);

轻量级数据结构的性能更好,占用的内存/垃圾收集开销更少。所以,数组应该是最快的。EnumMap是一块隐藏的宝石,在适当的情况下,它也可以提高性能

番石榴提供了

嗨,我这里不使用SQL。那么贴图应该保留最新插入的值吗?我认为Map不允许重复,因此插入新的键值对没有意义。但如果这是真的,那么我看起来就不是了。是的,这很有道理。当值传入时,您将插入一个新的计数,因此您必须做一些工作来更新它。在Java中,您不能使用原始数字类型进行参数化。你必须用
Integer
而不是
int
@Dylan:谢谢!我的C#.Net背景肯定已经展现出来了:-)我不得不重新考虑一下,记住
String
在Java中以大写字母S开头。此外,(我知道这只是一个例子)但是在一个整数对象上执行所有的加法操作可能不是最优的,因为所有的自动装箱/自动取消装箱都发生了。这不会杀死你的代码。让它工作起来,测量它,看看它是否会影响性能,然后再立即排除某些内容。@Ed Staub hi Ed no row不是指数据库中的表行,它实际上是队列中的数据,一个接一个地到达,就像它是数据库一样。。