2014-04-15 2 views
0

개체 배열에 개체가 나타나는 위치의 인덱스를 반환하려고합니다.개체 배열을 통해 검색

public static int search(WordCount[] list,WordCount word, int n) 
{ 
    int result = -1; 
    int i=0; 
    while (result < 0 && i < n) 
    { 
     if (word.equals(list[i])) 
     { 
      result = i; 
      break; 
     } 
     i++; 
    } 
    return result; 
} 

WordCount[]은 개체의 배열입니다.

wordWordCount의 인스턴스입니다.

nWordCount[]

그것은 실행의 개체 수 있지만 제대로 인덱스를 반환하지 않습니다. 모든 도움을 주시면 감사하겠습니다. 시간 내 줘서 고마워.

CLASS 사용하는 .equals의 구현() 올바르게 경우 확인되지 않기 때문에이 방법은 아마 작동하지

for (int i=0;i<tokens.length;i++) 
     { 
      if (tokens[i].length()>0) 
      { 
       WordCount word = new WordCount(tokens[i]); 
       int foundAt = search(wordList, word, n); 
       if (foundAt >= 0) 
       { 
        wordList[foundAt].increment(); 
       } 
       else 
       { 
        wordList[n]=word; 
        n++; 
       } 
      } 
     } 
    } 
+2

어떤 결과가 나옵니까? –

+2

'WordCount'에 대한 'equals' 구현을 보여주십시오. – Radiodef

+0

WordCount에서 equals() 및 hashCode() 메서드를 재정의 했습니까? –

답변

1

, Object#equals은 두 참조가 동일한 객체를 참조하는지 여부를 반환합니다 (== 연산자와 동일). 현재하고있는 일을 살펴보면 WordCountword을 반환하는 방법을 만드는 것이 좋습니다.:

if (word.equals(list[i])) 

에 :

public String getWord() { 
    return word; 
} 

는 다음에서 search에 비교를 변경

if (word.getWord().equals(list[i].getWord())) 

을 정도 생성하지 않는 String을 받아 메소드의 서명을 변경하려면 당신이 할 필요가없는 새로운 객체.

나는 당신이 다른 필드를 가지고 있기 때문에 개체 평등을 결정하는 유일한 word를 사용하도록 WordCountequals를 오버라이드 (override) 추천하지 않을 것입니다. (예를 들어 카운트가 같을 경우에만 두 개의 카운터가 같다고 기대할 수 있습니다.)

다른 방법으로는 연관 컨테이너 인 Map을 사용하는 것입니다. 예를 들면 다음과 같습니다.

public static Map<String, WordCount> getCounts(String[] tokens) { 
    Map<String, WordCount> map = new TreeMap<String, WordCount>(); 

    for(String t : tokens) { 
     WordCount count = map.get(t); 
     if(count == null) { 
      count = new WordCount(t); 
      map.put(t, count); 
     } 

     count.increment(); 
    } 

    return map; 
} 
+0

고마워요. 내 클래스에 getWord 함수를 던지는 것만 큼 간단하지 않았습니다. 지난 3 시간 동안이 문제에 대해 조사했습니다. 웬일인지 나의 증가는 일하고 있지 않느냐? 출력을 출력 할 때 모든 단어에 대해서만 (1)을 인쇄합니다. 내가 여기서 잘못 가고있는 어떤 생각? – Bob

+0

나는 바보 야, 내 문제를 발견했다. 나는 정말로 모든 도움에 감사한다. – Bob

0

내가 전화 했어 어떻게
class WordCount 
{ 
String word; 
int count; 
static boolean compareByWord; 
public WordCount(String aWord) 
{ 
    setWord(aWord); 
    count = 1; 
} 
private void setWord(String theWord) 
{ 
    word=theWord; 
} 
public void increment() 
{ 
    count=+1; 
} 
public static void sortByWord() 
{ 
    compareByWord = true; 
} 
public static void sortByCount() 
{ 
    compareByWord = false; 
} 
public String toString() 
{ 
    String result = String.format("%s (%d)",word, count); 
    return result; 
} 
} 

... 두 개체는 동일합니다.

은 당신이 중 하나 (등호를 오버라이드 (override)) 및 필요 해시 코드() 당신의 단어 수 개체에 대한 방법, 또는 즉 비교하려는 것을 반환이 : word.getWord().equals(list[i].getWord())

0

사용하기 쉬운 것을 :

public static int search(WordCount[] list, WordCount word) 
{ 
    for(int i = 0; i < list.length; i++){ 
     if(list[i] == word){ 
      return i; 
     } 
    } 
    return -1; 
} 

배열의 각 값을 검사하여 지정한 단어와 비교합니다.

+0

이것은 작동하지 않습니다. 워드 카운트는 == 연산자를 사용하여 비교할 수 없습니다. –

0

현재 접근법에서 이상한 점은 특정 단어의 수를 찾기 위해 새로운 WordCount 개체를 만들어야한다는 것입니다. 당신은 당신의 WordCount 클래스

public boolean hasEqualWord(WordCount other) 
{ 
    return word.equals(other.word); 
} 

같은 방법을 추가하고, equals 방법 대신에 그것을 사용할 수 있습니다

.... 
while (result < 0 && i < n) 
{ 
    if (word.hasEqualWord(list[i])) // <--- Use it here! 
    { 
    .... 
    } 
} 

하지만 난 당신이 모델링하려고하는 것을 재고 할 것을 권 해드립니다 - 그리고 어떻게. 단어와 그 "카운트"를 요약하는 클래스를 만드는 것이 기술적으로 "잘못"되는 것은 아니지만 더 멋진 솔루션이있을 수 있습니다. 예를 들어,이 단어 만 계산에 대한 때, 당신은지도 고려할 수 : 이후

Map<String, Integer> counts = new LinkedHashMap<String, Integer>(); 
for (int i=0;i<tokens.length;i++) 
{ 
    if (tokens[i].length()>0) 
    { 
     Integer count = counts.get(tokens[i]); 
     if (count == null) 
     { 
      count = 0; 
     } 
     counts.put(tokens[i], count+1); 
    } 
} 

을, 당신이지도에서 각 단어의 발생 수를 찾아 볼 수 있습니다 : 기본적으로

String word = "SomeWord"; 
Integer count = counts.get(word); 
System.out.println(word+" occurred "+count+" times); 
관련 문제