>

stackoverflow 에서 이것을 검색했습니다.  이 경우 관련이없는 스레드를 찾았습니다. 나는 또한 스스로 시도했으며 해결책까지 계속 노력할 것입니다. 그러나 코드에서 실수를 저지르면 누군가가 나를 보여 주면 좋을 것입니다.

<시간>

HashSet 가 있어요  중복 문자열이 추가되는 것을 막을 수 있습니다. 그리고 만약 HashSet  추가하는 경우 고유 한 문자열이어야합니다.

<시간>

클래스 선언은 :

public List<String> ContactsList;
public List<String> ContactsNumbersList;

HashSet 의 도움을 받아 연락처를 가져 와서이 두 목록에 추가하는 코드  중복 번호를 유지하려면 :

   ContactsList = new ArrayList<String>();
    ContactsNumbersList = new ArrayList<String>();
    HashSet<String> normalizedNumbersAlreadyFound = new HashSet<>();
    // Contacts Database queries
    Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}, null, null,  ContactsContract.CommonDataKinds.Phone.SORT_KEY_PRIMARY +" ASC");

    while (cursor.moveToNext())
    {
        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        if (normalizedNumbersAlreadyFound.add(phoneNumber))
        {
            phoneNumber = phoneNumber.replace("-","");
            phoneNumber = phoneNumber.replace(" ","");
            phoneNumber = phoneNumber.replace("(","");
            phoneNumber = phoneNumber.replace(")","");
            ContactsList.add(name);
            ContactsNumbersList.add(phoneNumber);
        }
    }
    cursor.close();

<시간>

그럼 왜 내 ContactsNumbersList  중복 된 항목이 있습니까? 제안 해 주셔서 감사합니다 .. 도움이 될 것입니다.

  • 답변 # 1

    디자인에 문제가있는 것 같습니다.

    먼저 List 가 필요하지 않습니다 복제본없이 컬렉션을 사용하는 것이 목표 인 경우.

    Set 만 사용하십시오  대신에.

    두 번째로, 특히 코드에서 요소가 Set 에 추가되는지 여부를 확인하고 있습니다.  정규화 및 정규화 된 String 추가   List 에 .

    따라서 당신의 List 는  정규화 전에 다른 두 요소가 정규화 후에 동일 할 수 있으므로 중복이 포함됩니다.

    이렇게하면 Set 를 사용하라고 조언 할 수 있습니다.   List 를 사용하여 직접 무시  이 사용 사례에서.

    List<String> source = Arrays.asList("123-456789", "(1)23456789");
    System.out.printf("Source List contains: %s%n", source);
    Set<String> set = new HashSet<>();
    List<String> unnecessary = new ArrayList<>();
    Set<String> useful = new HashSet<>();
    for (String s: source) {
        if (set.add(s)) System.out.printf("Added %s to set.%n", s);
        s = s.replaceAll("[()-]", "");
        System.out.printf("\t... now normalized to %s%n", s);
        // s is now normalized
        unnecessary.add(s);
        useful.add(s);
    }
    System.out.printf(
        "Set contains %s.%nUnnecessary List contains %s.%nUseful Set contains %s.%n", 
        set, 
        unnecessary,
        useful
    );
    
    

    출력

    Source List contains: [123-456789, (1)23456789]
    Added 123-456789 to set.
        ... now normalized to 123456789
    Added (1)23456789 to set.
        ... now normalized to 123456789
    Set contains [(1)23456789, 123-456789].
    Unnecessary List contains [123456789, 123456789].
    Useful Set contains [123456789].
    
    

  • 이전 django - 외래 키를 다른 모델의 필드로 설정하는 방법은 무엇입니까?
  • 다음 python 3.x - locals ()를 사용하여 메소드 서명에서 kwarg 이름을 가져와 메소드 서명을 단일 dict로 병합하십시오