2016-08-26 3 views
3

indexOf 메서드를 사용하여 객체의 위치를 ​​반환하고 싶지만이 이름을 검색하려는 연락처의 이름 만 전달하려는 경우에는 이게 끝날거야?arrayList에있는 customObject와 함께 IndexOf 사용

public int findItem(String name) 
    { 
     int max = contactList.size(); 

     //you might have to subtract this by one 
     //I'm not sure off the top 
     int descCnt = max; 


     for(int cnt = 0; cnt <= max/2; cnt++) 
     { 
      if(contactList.get(cnt).getName().equals(name)) return cnt; 
      if(contactList.get(descCnt).getName().equals(name)) return descCnt; 
      --descCnt; 
     } 

    } 

답변

1

가 Heres는 전체 목록을 거치지 않고 이것을 달성하는 함수, 나는 복잡도가 O (N)보다 작은 생각 :

나는 현재이 방법이 당신이 묻는 것은 List#indexOf(Object)의 계약서에 없기 때문에 그렇게하지 마십시오. 그렇게해서는 안됩니다.

대신 비교적 쉽게 원하는 것을 달성 할 수있는 고유 한 방법을 작성할 수 있습니다. 목록을 반복하고 지정된 이름과 일치하는 연락처를 찾으십시오.

/** 
* Returns the List index of the Contact with the specified name. If no such 
* Contact is found, -1 will be returned. 
*/ 
public int findItem(String name) { 
    for (int i = 0; i < contactList.size(); i++) { 
     Contact contact = contactList.get(i); 
     if (null == contact) continue; 
     if (java.lang.Objects.equals(name, contact.getName())) return i; 
    } 
    return -1; 
} 
+0

아니요, 여전히 O (n)입니다. 이러한 종류의 "최적화"는 목록의 양쪽 끝에서 항목을 가져 오는 것이 더 많은 캐시 가져 오기를 유발할 수 있기 때문에 상황을 더 느리게 만들 수 있습니다. –

+0

복잡도는 O (n)입니다. for-loop에서 반만큼 반복 작업을 수행 할 수도 있지만 모든 요소를 ​​여전히 검사하고 있습니다. 이것은 모든 것을 하나씩 반복하는 것보다 낫지 않습니다. – nasukkin

+0

나는 본다. 명확하게 해 주셔서 감사합니다. 평균적으로 응답 속도가 빨라 집니까? @AndyTurner –

0

:

private static ArrayList<Contacts> contactList = new ArrayList<Contacts>(); 

public class Contacts { 
private String name; 
private String number; 


public Contacts(String name, String number) { 
    this.name = name; 
    this.number = number; 
} 

public String getName() { 
    return name; 
} 

public String getNumber() { 
    return number; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public void setNumber(String number) { 
    this.number = number; 
} 



public int findItem(String name) { 

    return contactList.indexOf(name); 
} 
+0

@SamOrozco 그럼요? 이 질문은 성능에 대한 언급이 없습니다. 그렇더라도,이 메소드는 임의의 ArrayList를 얻는 것만 큼 좋은 방법입니다. 이제 배열을 이름순으로 정렬하면 더 멋진 검색을 수행하고 O (ln (n))의 복잡성을 줄일 수 있습니다. 그러나이 질문은 복잡성 요구 사항 및 정렬 가능성에 대한 언급을하지 않습니다. – nasukkin

+0

내 이전 의견에 대해 죄송합니다. 혼란 스러웠습니다. –

0

그냥 사람을 추가 할 수 , 나는 그것을 이런 식으로 할 수있었습니다 : 그러나

public void searchItem(String name) { 
    for(int i = 0; i < contactList.size(); i++) { 
     if(name.equals(contactList.get(i).getName())) { 
      System.out.println("Found " + name); 
      break; 
     } 
     else { 
      System.out.println("Could not find name!"); 
     } 
    } 
} 

을, 이것은 내가 더 큰 목록을 가지고 있다면 상당히 비효율적 아닌가요? 이 작업을 수행하는보다 효율적인 방법이 있습니까?

+0

비효율적입니까? 응용 프로그램에서 작성한 것을 최적화하는 것과 관련하여 걱정해야 할 성능 문제가 있습니까? 기억하십시오 : 조기 최적화는 모든 악의 뿌리입니다. 여기에 적힌 내용은 목록을 통해 검색하는 훌륭한 방법입니다. – nasukkin

+0

'contactList'는'ArrayList'입니다. 따라서 항목을 찾을 때까지 모든 반복에'이름을 찾을 수 없습니다 '라는 것을 제외하고는 합리적으로 효율적입니다. 'LinkedList' (예를 들면)로 변경했다면리스트 검색이'RandomAccess'리스트에서'O (1)'과 같은 링크드리스트에서'O (n) ArrayList'). –

1

Contacts의 조회를 많은 이름으로 수행하는 경우 인스턴스를 Map<String, Contacts>에 넣을 수 있습니다. 특정 유형 Map은 요구 사항에 따라 다릅니다. HashMap이면 충분합니다.

contactMap.put(contacts.getName(), contacts); 

을 한 후 사용하여 맵에서 항목을 조회 : 대신 contactList.add(contacts)

, 당신은 사용할 수 있습니다

contactMap.get(someName); 

이 목록을 검색보다 검색을 할 빨라집니다 매번 룩업은 목록의 경우 O(n)과 비교하여 의 경우 O(1)이됩니다. 그러나 더 많은 메모리를 사용합니다.


덧붙여, 당신의 Contacts 클래스는 하나의 접촉을 표현처럼 보이는, 그래서는 단수로 지정해야합니다 : Contact은.

또한, 당신의 find 방법은 현재 인스턴스 메서드로 선언 :

public int findItem(String name) { 

실제로 Contacts의 다른 인스턴스를 찾을 Contacts의 인스턴스를 필요 의미한다. 대신, 그것을 static를 선언

public static int findItem(String name) { 

는 다음 인스턴스없이 호출 할 수

Contacts found = Contacts.find("name"); 
0

을 당신이 관심이 있다면. 더 좋은 방법은 객체에서 equals() 및 hashcode()를 재정의하는 것입니다. 그리고 적절한 방법으로 indexOf를 사용하십시오.

귀하의 동등 물은 이름을 기준으로 동등성을 결정할 수 있으므로 모든 불필요한 코드가 제거됩니다.