2

私が現在取り組んでいるプロジェクトでは、テキストファイルから単語を読み取り、それらを配列にロードします(最終的にはバイナリツリーになりますが、後で終了します)。単語と単語の頻度(最初は1)の両方を配列にロードする必要があるため、両方の変数をオブジェクトにパックしましたWordNode。単語を配列にロードすることはできますが、単語がすでに配列にあるかどうかを確認しようとすると、状況が崩れます。もしそうなら、頻度を1増やす必要があります。ただし、私のコードは単語をチェックせず、とにかくそれを追加するだけです(単語自体ではなく、変数への参照をチェックしていると思います)。以下は私のmainメソッドとWordNodeクラスです。

主な方法:

public class Driver {
/////////////// fields ///////////////
public static ArrayUnorderedList<WordNode> wordArray = new ArrayUnorderedList<WordNode>();
public static LinkedBinarySearchTree<WordNode> wordTree = new LinkedBinarySearchTree<WordNode>();   //tree to hold words

/////////////// methods ///////////////
public static void main(String[] args) throws Exception {
    //ask for filename       
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Enter the name of the file to read from: ");
    Reader file = new FileReader(reader.readLine());

    //read file
    Scanner input = new Scanner(file);

    while(input.hasNext()) {
        //get words from file
        String word = input.next();

        //remove non-word characters and convert to lowercase
        word = word.replaceAll("\\W", "");
        word = word.toLowerCase();

        //create node
        WordNode newWord = new WordNode(word);

        //if word is already in array
        if(wordArray.contains(newWord)) {
            System.out.println("Word is already in array");

            //increment frequency by 1
            int index = wordArray.find(newWord);
            wordArray.list[index].setFrequency(wordArray.list[index].getFrequency() + 1);
            System.out.println(newWord.getWord() + newWord.getFrequency());
        } else {
            System.out.println("Word is not yet in array");

            //add word to tree
            System.out.println(newWord.getWord());
            wordArray.addToRear(newWord);
        }
    }

    //insert into tree

    //perform traversals on tree
}

WordNodeクラス:

public class WordNode {
   protected String word;
   protected WordNode left, right;
   protected int frequency;

   /**
    * Creates a new node with the specified data.
    * @param obj the element that will become a part of the new node
    */
   WordNode(String obj) {
      word = obj;
      left = null;
      right = null;
      frequency = 1;
   }

   /**
    * Gets the word.
    * @return the word
    */
   public String getWord() {
      return word;
   }

   /**
    * Sets the word.
    * @param word the word to set
    */
   public void setWord(String word) {
      this.word = word;
   }

   /**
    * Gets the left.
    * @return the left
    */
   public WordNode getLeft() {
      return left;
   }

   /**
    * Sets the left.
    * @param left the left to set
    */
   public void setLeft(WordNode left) {
      this.left = left;
   }

   /**
    * Gets the right.
    * @return the right
    */
   public WordNode getRight() {
      return right;
   }

   /**
    * Sets the right.
    * @param right the right to set
    */
   public void setRight(WordNode right) {
      this.right = right;
   }

   /**
    * Gets the frequency.
    * @return the frequency
    */
   public int getFrequency() {
      return frequency;
   }

   /**
    * Sets the frequency.
    * @param frequency the frequency to set
    */
   public void setFrequency(int frequency) {
      this.frequency = frequency;
   }
}

ArrayListクラスのいくつかのメソッド:

/**
* Returns true if this list contains the specified element.
* @param target the element that the list is searched for
* @return true if the target is in the list, false if otherwise 
*/
public boolean contains(T target) {
    return (find(target) != NOT_FOUND);
}

/**
* Returns the array index of the specified element, or the
* constant NOT_FOUND if it is not found.
* @param target the element that the list will be searched for
* @return the integer index into the array containing the target element, or the NOT_FOUND constant
*/
public int find(T target) {
    int scan = 0, result = NOT_FOUND;
    boolean found = false;

    if (!isEmpty()) {
       while (!found && scan < rear) {
          if (target.equals(list[scan])) {
              found = true;
          } else {
             scan++;
          }
       }
    }

    if (found) {
       result = scan;
    }

    return result;
}
4

2 に答える 2

4

コードが機能しない直接の理由は、おそらくエントリがリストにあるかどうかを判断するためにメソッドにArrayUnorderedList#contains()依存しているためです。equals()クラスの定義を見ずに知ることは不可能です。

のオーバーライドを指定していないため、equals()オブジェクトID(デフォルトはfrom Object)を使用しているため、すべてWordNodeが他のすべてとは異なりWordNodeます。

使用する場合は、正しい動作で ArrayUnorderedList実装する必要があります。WordNode#equals()

ただし、頻度を保存する代わりにMap<String,Integer>(または)を使用することを検討する必要があります。Map<String,WordNode>これははるかに高速になります。

于 2012-04-11T20:40:29.217 に答える
0

WordNodeのeqaulsをオーバーライドする必要があります。

public boolean equals(Object o) {
     if(o instanceof WordNode) {
        WordNode temp = (WordNode) o;
        return(temp.getWord().equals(this.word));
     }
     else
         System.out.println("Object o you passed is not a WordNode");
}

このように、2つの異なるWordNodeオブジェクトがワードフィールドと同じ文字列を持っている場合、それらは等しいと見なされます

等しいと呼ぶ方法:

WordNode n1 = new WordNode();
n1.setWord("test");

WordNode n2 = new WordNode();
n2.setWord("test");

System.out.println(n1.equals(n2));

したがって、equalsはObject型のオブジェクトを受け取りますが、WordNodeでequalsを呼び出すと、WordNodeのインスタンスでもあるオブジェクトを提供することになります。そうしないと、作成したキャストが失敗し(例外)、もちろん、オブジェクトはWordNodeと同じです

于 2012-04-11T20:46:32.460 に答える