通过java中的arraylist中的特定字段查找大多数对象

时间:2013-01-19 19:09:55

标签: java algorithm

我有一个对象的arraylist,其中包含对特定目的地号码的呼叫信息。我一直试图找出搜索此列表的最佳方法,并返回出现次数最多的数字以及这些事件的数量(从链接类中的另一个方法调用)。

例如:

我有这种方法,通过调用地址簿中的随机数

来添加对列表的调用
public void makeCall(Phonecall call)
    {
     call = new Phonecall();
     call.setDestination(anyNumber());
     call.setDuration(0 + (int)(Math.random() * (((balance/25) * 60) - 0) + 1));
     double cost = (call.getDuration()/60 * 25);
     balance = getBalance() - cost;
     updateCallHistory(call);
    }

然后我需要能够搜索它正在更新的arraylist callHistory并找到被调用次数最多的目的地并返回该数字和计数。

然后我会为一个人的每个“手机”调用这些值,并打印所有“手机”中最高计数的目的地以及它的数量。

我一直在环顾四周,找到了有关查找特定对象事件的信息,但却无法弄清楚如何检查该对象中的特定字段而不是对象本身。

很抱歉,如果这听起来有点令人费解,但是我很困惑并且已经用完了想法,我的哈希映射还不是很强大,而且我无法调整我发现的做我想做的事情。< / p>

基于以下评论,我有

public void mostCalled(String[] args) 
    {
        Map<Phonecall,Integer> map = new HashMap<Phonecall, Integer>();  
        for(int i=0;i<callHistory.size();i++){              
            Integer count = map.get(callHistory.get(i));         
            map.put(callHistory.get(i), count==null?1:count+1);  
        }  
        System.out.println(map);
    }

但我不知道如何使用Phonecall的目标字段而不是对象本身。

这样的事情会更合适:

public void mostCalled(String[] args) 
    {
        Map<String,Integer> map = new HashMap<String, Integer>();  
        for(Phonecall call : callHistory)
        {
            Integer count = map.get(call.destination);         
            map.put(call.destination, count==null?1:count+1);  
        }  
        System.out.println(map);
    }

2 个答案:

答案 0 :(得分:2)

一种解决方案是声明一个Map<String, Integer> phoneCount,它将一个电话号码作为密钥,并将对该号码的呼叫数量作为值。

然后,您将遍历ArrayListPhoneCall个对象并构建地图。具有最大价值的记录是您正在寻找的记录。

答案 1 :(得分:0)

对于任何想要这样做的人来说,这就是我最终的目标。

public void mostCalled() 
    {
        Map<String,Integer> map = new HashMap<String, Integer>();  
        for(Phonecall call : callHistory)
        {
            Integer count = map.get(call.destination);         
            map.put(call.destination, count==null?1:count+1);  
        }  
        List<String> maxKeyList=new ArrayList<String>();
        Integer maxValue = Integer.MIN_VALUE; 
        for(Map.Entry<String,Integer> entry : map.entrySet()) 
        {
             if(entry.getValue() > maxValue) 
             {
                 maxValue = entry.getValue();
                 maxKeyList.add(entry.getKey());
             }
        }
        System.out.println("Phone numbers called the most : "+maxKeyList);
    }