Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算ArrayList中特定变量的出现次数_Java_Arraylist_Collections_Hashmap - Fatal编程技术网

Java 计算ArrayList中特定变量的出现次数

Java 计算ArrayList中特定变量的出现次数,java,arraylist,collections,hashmap,Java,Arraylist,Collections,Hashmap,在我的类Feeds中,我与其他成员一起拥有一个名为“Date”的成员变量,它属于String类型。我有一个ArrayList的feed对象。我想查找具有相同日期字符串的对象的实例。然后,可以将这些事件放入一个HashMap中,该HashMap包含字符串日期作为键,事件的#作为值 大致如下: List<Feeds> m_feeds = new ArrayList<Feeds>(); //add all feeds objects m_feeds.add(...); in

在我的类
Feeds
中,我与其他成员一起拥有一个名为“Date”的成员变量,它属于
String
类型。我有一个
ArrayList
feed
对象。我想查找具有相同日期字符串的对象的实例。然后,可以将这些事件放入一个
HashMap
中,该HashMap包含
字符串
日期作为键,事件的#作为值

大致如下:

List<Feeds> m_feeds = new ArrayList<Feeds>();

//add all feeds objects
m_feeds.add(...);

int occurrences = 0;
HashMap<String, Integer> repeatedDatabase = new HashMap<String, Integer>();

for (Feeds f : m_feeds){
     occurrences = Collections.frequency(m_feeds, f.date);
     // i know this method compares objects but i want to know how 
    // only a single variable can be done
    repeatedDatabase.put(f.date, occurrences);
}
List m_feeds=new ArrayList();
//添加所有提要对象
m_提要。添加(…);
int=0;
HashMap repeatedDatabase=新HashMap();
对于(源f:m_源){
发生次数=收集次数。频率(m_feed,f.date);
//我知道这个方法比较对象,但我想知道如何比较
//只能执行单个变量
repeatedDatabase.put(f.日期、事件);
}

如果您正确地重写了
equals
,并在
提要
类中为具有相同日期的两个
提要
实例返回
true
,则代码将起作用(因为如果您尝试在映射中放置同一个键两次,新值将覆盖旧值,并且在您的情况下,值也将相同,因此不会有任何区别)。但是,每次调用
Collections.frequency
都将在整个列表中迭代,这将给您一个O(n^2)时间复杂度

for (Feeds f : m_feeds){
    if (!repeatedDatabase.containsKey(f.date)) {
        repeatedDatabase.put(f.date, 1);
    } else {
        repeatedDatabase.put(f.date, repeatedDatabase.get(f.date)+1);
    }
}
提高效率的一种方法是:

for (Feeds f : m_feeds){
    if (!repeatedDatabase.containsKey(f.date)) {
        occurrences = Collections.frequency(m_feeds, f.date);
        repeatedDatabase.put(f.date, occurrences);
    }
}
这仍然需要进行更多的迭代。它将为每个唯一的日期调用一次
Collections.frequency
,这意味着您将重复列表中存在唯一日期的次数

更高效的实现根本不会使用
Collection.frequency
。相反,您只需在列表上迭代一次,然后自己计算每个日期的出现次数。这将使您的时间复杂度为O(n)

for (Feeds f : m_feeds){
    if (!repeatedDatabase.containsKey(f.date)) {
        repeatedDatabase.put(f.date, 1);
    } else {
        repeatedDatabase.put(f.date, repeatedDatabase.get(f.date)+1);
    }
}

为什么不直接使用hashMap呢

你可以这样做

HashMap<String,Iteger> map = new HashMap<>();
for (Feeds f : m_feeds){
    if (map.contains(f.getDate()) { // use the method to get the date
        map.put(f.getDate(),map.get(f)+1);
    else
        map.put(f.getDate(),1);
}
HashMap map=newhashmap();
对于(源f:m_源){
如果(map.contains(f.getDate()){//请使用该方法获取日期
map.put(f.getDate(),map.get(f)+1);
其他的
map.put(f.getDate(),1);
}

我没有测试代码,但它应该可以工作。

除了给您提供一个简单的解决方案之外,我还冒昧地修复了代码中的一些内容。请看一下:

List<Feeds> mFeeds = new ArrayList<>(); //If you are using Java 7+ you do not need to declare explicitly the Type in Diamonds. If you aren't, ignore this. Also fixed name to adapt to Java standards.

//add all feeds objects
m_feeds.add(...);

HashMap<String, Integer> repeatedDatabase = new HashMap<>(); //See Above.

for (Feeds f : m_feeds){
    String s = f.date; //Suggestion: use a getter method, do not make public variables accessible outside class
    Integer i = repeatedDatabase.get(s);
    if (i == null){
        repeatedDatabase.put(s, 1);
    } else {
        repeatedDatabase.put(s, i+1);
    } 
}
List mFeeds=new ArrayList();//如果您使用的是Java 7+,则不需要显式地以菱形声明类型。如果不需要,请忽略此项。此外,还需要固定名称以适应Java标准。
//添加所有提要对象
m_提要。添加(…);
HashMap repeatedDatabase=new HashMap();//参见上文。
对于(源f:m_源){
String s=f.date;//建议:使用getter方法,不要使公共变量在类外可访问
整数i=repeatedDatabase.get(s);
如果(i==null){
repeatedDatabase.put(s,1);
}否则{
repeatedDatabase.put(s,i+1);
} 
}

对Angelo答案的一个小更新..再进一步..你也可以像这样使用字符串int[]的映射

Map<String,int[]> map = new HashMap<>();
int[] countArray = map.get(key);
if(countArray == null)
   map.put(key, new int[]{0});
else
  countArray[0]++;
Map Map=newhashmap();
int[]countArray=map.get(key);
if(countArray==null)
put(key,newint[]{0});
其他的
countArray[0]++;

使用参考文献之美:)

如何计算m_feedsIt中重复的日期整数。它试图从日期键中获取一个整数。如果映射中有一个整数,则结果将是整数;如果没有,则结果将是null。如果为null,则在映射中放入一个新集合,如果不是,则在映射到日期的整数中添加一个。@stud91如果需要,可以编写if\else语句如下:repeatedDatabase.put(s,i==null?1:i+1);但这只是一个简单的例子。