2010-02-18 4 views
4

나는 내가 작성한 '여행 일정'객체 (다른 대상 목록이 들어있는)에서 가장 일반적으로 발생하는 '대상'을 찾기 위해 ArrayList의 문자열을 검색 할 수 있는지 궁금합니다.)가장 일반적인 문자열에 대한 배열 목록 검색

지금까지 내가 가진 :

public static String commonName(ArrayList<Itinerary> itinerary){ 

    int count = 0; 
    int total = 0; 

    ArrayList<String> names = new ArrayList<String>(); 
    Iterator<String>itr2 = names.iterator(); 

    while(itr.hasNext()){ 

     Itinerary temp = itr.next(); 

     if(temp.iterator().hasNext()){ //if its has destinations 

       // Destination object in itinerary object 
       Destination temp2 = temp.iterator().next(); 
       String name = temp2.getDestination().toLowerCase().replace(" ", ""); 

       if(names.contains(name)){ 
        count = count + 1; 
        //do something with counting the occurence of string name here 
       } 

나는 넥타이가있는 경우 가장 일반적으로 발생하는 문자열 또는 문자열 배열을 검색하는 알고리즘을 만드는 데 문제가; 문자열이있는 '일정표 객체'(매개 변수 값)의 수를 표시합니다. 도움이 될 것입니다. 감사합니다!

+0

는 유용하지 않다 혼란스럽고 추악한. –

+0

바울의 주장에 덧붙이 자면, 코드를 바꿀 때 재앙이 되겠지만, 변경 사항을 반영하기 위해 주석을 업데이트하지 마십시오. – mfeingold

답변

8

나는 HashMap<String,Integer>으로 만들 것입니다. 그런 다음 각 여정을 살펴보고지도에서 목적지가 wans't라면 put (대상, 1)을 사용하여 항목을 만듭니다. 그렇지 않으면 put (대상, get (대상) + 1). 이후에 나는 Map 엔트리를 살펴보고 가장 많은 것을 가진 것을 찾았습니다.

+0

아마도 가장 효율적인 것은 아니지만 (CPU주기를 기반으로) 가장 적은 금액으로 가장 먼저 마음에 듭니다. 작업을 완료하는 코드 +1. –

+0

get (destingation) +1 단계를 실행했을 때 '최대'값을 유지했다면 마지막 단계를 건너 뛰고 (맵 항목을 실행하고 가장 높은 개수를 찾으십시오). 새 값이 표시된 것보다 크면 해당 항목에 대한 포인터를 저장하십시오. (나는 이것이 O (n)만큼 빠른 해결책이라고 생각한다.) nnogn은 정렬보다 확실히 빠르다. –

+0

나의 해결책은 O (N)이다 - 당신은 여정의 목록을 한번 훑어 본 다음 목록을 횡단하고있다. 한 번 발견 된 목적지 중 –

0

외부 항아리 사용에 신경 쓰지 않는다면 쉽게 할 수있는 아파치 공유의 HashBag를 사용할 수 있습니다.

public static String commonName(ArrayList<Itinerary> itinerary){ 

int count = 0; 
int total = 0; 
Bag names = new HashBag(); 

while(itr.hasNext()){ //while array of Itinerary object has next 
    Itinerary temp = itr.next(); //temp = 1st itineray object 
    if(temp.iterator().hasNext()){ //if its has destinations 
      Destination temp2 = temp.iterator().next(); //n Destination object in itinerary object 
      String name = temp2.getDestination().toLowerCase().replace(" ", ""); 
      names.add(name, 1); 
    } 
} 

그리고 나중에는

http://commons.apache.org/collections/userguide.html#Bags

+0

매우 빠르고 유용한 답변에 감사드립니다. 나는 방금 자바를 배우기 시작했고, 비록 내가 아파치 (Java) API에서 그것을보기 위해 HashBag를 사용하지 않았지만! 다시 감사합니다! – LeighA

0

lambdaj 라이브러리의 그룹 기능을 사용해보십시오 참조 DESTINATION1의 발생 횟수를 얻기 위해 ("DESTINATION1") names.getCount를 호출 할 수 있습니다. 당신이 그룹 대상 속성에 Itenarary 개체 수 문제를 해결 한 후 다음 예에서와 같이 가장 큰 크기를 가진 그룹을 확인하는 방법은 다음과 같습니다

Group<Sale> group = selectMax(group(itineraries, 
    by(on(Itenarary.class).getDestination())).subgroups(), on(Group.class).getSize()); 
0

In statistics, this is called the "mode"합니다. 바닐라 자바 ​​(8) 솔루션은 다음과 같습니다

itinerary 
     .stream() 
     .flatMap(i -> StreamSupport.stream(
      Spliterators.spliteratorUnknownSize(i.iterator(), 0) 
    )) 
     .collect(Collectors.groupingBy(
      s -> s.getDestination().toLowerCase().replace(" ", ""), 
      Collectors.counting() 
    )) 
     .entrySet() 
     .stream() 
     .max(Comparator.comparing(Entry::getValue)) 
     .ifPresent(System.out::println); 

jOOλ는 스트림에 mode()을 지원하는 라이브러리입니다. 다음 프로그램 :

System.out.println(
    Seq.seq(itinerary) 
     .flatMap(i -> Seq.seq(i.iterator())) 
     .map(s -> s.getDestination().toLowerCase().replace(" ", "")) 
     .mode() 
); 

(면책 조항 : 나는 jOOλ 뒤에 회사에 근무) 사실은 그것의 같은 자바 코드를 말한다 정확하게 말로 설명하는 각 라인에 주석을 추가