Java 寻找合适的逻辑

Java 寻找合适的逻辑,java,android,database,Java,Android,Database,实际上,我使用调用日志作为数据库的输入,然后以一种在显示它时无法获取任何重复值的方式获取它,如果数据库中有任何重复值,则应将其作为整数值计数。例如:john6。 这里john必须在数据库中输入6次。别误会我。我不需要密码,我需要帮助。以下是代码: ContentResolver cr = getContentResolver(); Cursor cur = cr.query(android.provider.CallLog.Calls.CONTENT_URI,null, null,

实际上,我使用调用日志作为数据库的输入,然后以一种在显示它时无法获取任何重复值的方式获取它,如果数据库中有任何重复值,则应将其作为整数值计数。例如:john6。 这里john必须在数据库中输入6次。别误会我。我不需要密码,我需要帮助。以下是代码:

  ContentResolver cr = getContentResolver();
     Cursor cur = cr.query(android.provider.CallLog.Calls.CONTENT_URI,null, null, null, null);
     if (cur.getCount() > 0) {

         while (cur.moveToNext()) {
     String rawContactId = cur.getString(cur.getColumnIndex(android.provider.CallLog.Calls._ID));
    Cursor callLogCursor = getContentResolver().query(
            android.provider.CallLog.Calls.CONTENT_URI, new String[]{

                    android.provider.CallLog.Calls.CACHED_NAME,
                    android.provider.CallLog.Calls.CACHED_NUMBER_LABEL,
                    android.provider.CallLog.Calls.NUMBER,
                    android.provider.CallLog.Calls.DATE,
                    android.provider.CallLog.Calls.DURATION,
                    android.provider.CallLog.Calls.TYPE
            },android.provider.CallLog.Calls._ID + "=?", new String[] { rawContactId }, null);;

      if (callLogCursor != null) {
        while (callLogCursor.moveToNext()) {
            //String id = callLogCursor.getString(0);
            String name = callLogCursor.getString(0);
            String cacheNumber = callLogCursor.getString(1);
            String number = callLogCursor.getString(2);
            long dateTimeMillis = callLogCursor.getLong(3);
            long durationMillis = callLogCursor.getLong(4);
            int callType = callLogCursor.getInt(5);

            String duration = getDuration(durationMillis * 1000);

            String dateString = getDateTime(dateTimeMillis);


            if (cacheNumber == null)
                cacheNumber = number;
            if (name == null)
                name = "Unknown";
            Uri image = null;

            try {
                String conId = fetchContactIdFromPhoneNumber(cacheNumber);
                long contId = Long.parseLong(conId);
                image = getPhotoUri(contId);
            }catch(Exception e) {
                Log.e("Exception", e.getMessage());
            }


                //CallLogModel callLogModel = new CallLogModel(image, name, cacheNumber,
                    //  duration, dateString);
                ContentValues values = new ContentValues();
                values.put(NAME, name);
                values.put(NUMBER, cacheNumber);
                values.put(DATE, dateString);
                values.put(DURATION,duration );
                database.insert(CALL_LOG_TABLE, null, values);

                Cursor cursor = database.query(CALL_LOG_TABLE, new String [] {LOG_ID, NAME, NUMBER, DATE, DURATION}, null, null, null, null, null);

                int row =0;
                if(!cursor.isAfterLast()) {
                    cursor.moveToFirst();

                    do{

                        int pId=cursor.getInt(0);
                        String pName = cursor.getString(1);
                        String pNumber = cursor.getString(2);
                        String pDate = cursor.getString(3);
                        String pDuration = cursor.getString(4);
                        int value = 0;

                        CallLogModel callLogModel = new CallLogModel(image, name, cacheNumber, duration, dateString);

                        if (callType == CallLog.Calls.OUTGOING_TYPE) {
                            for(int i=0;i<outgoingList.size();i++){
 ------------------------------Actually i want Logic here what should i do here--------------

                                }
                            }
                            outgoingList.add(callLogModel);

                        } else if (callType == CallLog.Calls.INCOMING_TYPE) {
                            incomingList.add(callLogModel);

                        } else if (callType == CallLog.Calls.MISSED_TYPE) {
                            missedcallList.add(callLogModel);

                        }

                        cursor.moveToNext();
                    } while (!cursor.isAfterLast());
                }





        }

        callLogCursor.close();
    }
}

您可以在hashmap中对传出呼叫进行建模,例如:

    Map<String, Integer> outgoingCallsMap = new HashMap<String, Integer>();

    for (int i = 0; i < outgoingList.size(); i++) {
        String nameOfCallee = outgoingList.get(i);
        if (!outgoingCallsMap.containsKey(nameOfCallee)) {
            outgoingCallsMap.put(nameOfCallee, 1);
        } else {
            //Increment calls to this person
            outgoingCallsMap.put(nameOfCallee, outgoingCallsMap.get(nameOfCallee) + 1);
        }

    }

通过迭代outGoingList并将结果放入map,以contact name作为键,以CallLogModel对象列表作为值,删除outGoingList中的重复项。 你可以参考这个方法

private void convertToOutGoingMap(List<CallLogModel > outGoingList) {
        HashMap<String,List<CallLogModel>> outGoingMap = new HashMap<String, List<CallLogModel>>();//map which has CallLogModel.name as key and List<CallLogModel> as value.
        for(CallLogModel model : outGoingList){//Iterate thru the list.
            if(outGoingMap.containsKey(model.name))
            {
                outGoingMap.get(model.name).add(model);//if map contains key, add model to the list.
            } else {
                List<CallLogModel> modelList = new ArrayList<CallLogModel>();//if it does not contains, initialize a list and add model to it.
                modelList.add(model);
                outGoingMap.put(model.name, modelList);
            }
        }
    }

}
此映射的键集为您提供唯一的呼叫日志名称,相应的值列表为所有事件,其大小为您提供事件数


希望这能对您有所帮助。

@aquaraga…outgoingList.geti将返回姓名、号码、日期、持续时间,我认为所有这些在任何时候都不可能相同。@user3101598 outgoingList由什么组成?我还以为是弦呢。如果列表中有其他类型的对象,比如Foo;您的电话号码将是outgoingList.geti.getName;