简体   繁体   中英

Grouping elements with same date in a custom ArrayList

I have a custom ArrayList where some objects have same date, so I want to merge them into a single object if their date is same, such that for each unique date there is only one item.

I have tried the following but it does not work as intended.

private ArrayList<Integer> getaardata()
{
    ArrayList<Integer> arr = new ArrayList<>();
    arr.clear();

    for(int i=0;i<CallLogger.arrContactDetails.size()-1;i++)
    {
        for (int k = i+1; k < CallLogger.arrContactDetails.size(); k++)
        {
            String dateCurrnt = Util.convertStringToDate(
                CallLogger.arrContactDetails.get(i).getDate());
            String dateCurrntNew = Util.convertStringToDate(
                CallLogger.arrContactDetails.get(k).getDate());

            if(dateCurrnt.equalsIgnoreCase(dateCurrntNew)){
                arr.add(Integer.parseInt(
                    CallLogger.arrContactDetails.get(i).getSmsCount()) + 
                    Integer.parseInt(CallLogger.arrContactDetails.get(k).getSmsCount()));
            }
            else
            {
                arr.add(Integer.parseInt(
                    CallLogger.arrContactDetails.get(k).getSmsCount())); 
            }
        }
    }
    Log.e("logtag", ""+arr.size());
    return arr;
}
if(dateCurrnt.equalsIgnoreCase(dateCurrntNew)){
    arr.set(i, Integer.parseInt(
        CallLogger.arrContactDetails.get(i).getSmsCount()) + 
        Integer.parseInt(CallLogger.arrContactDetails.get(k).getSmsCount()));
}
else
{
    arr.add(Integer.parseInt(CallLogger.arrContactDetails.get(k).getSmsCount())); 
}

You can use HashMap<String, Integer> , where String represents date field in string form & Integer represents smsCount field.

With this, you don't need to run a loop inside loop. Only one for loop will work.

String dateCurrnt = Util.convertStringToDate(
            CallLogger.arrContactDetails.get(i).getDate());

Map<String, Integer> map = new HashMap<String, Integer>();
if (map.contains(dateCurrnt)) {
  //get the value & add the new smsCount to it & set it
} else {
  //put the value in map (first time)
  map.put(dateCurrnt, Integer.parseInt(
                CallLogger.arrContactDetails.get(i).getSmsCount()));
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM