2010-12-05 5 views
1

私はこの問題を解決するために取り組んできました。これは、Javaでマルコフ連鎖アルゴリズムを実装することに関連しています。変数rにベクトルの要素の値を代入するとエラーになります。 。。(ライン54)【選択エラーは、アレイが必要な「読み取りますがjava.unit.Vectorが見つかりました。)のコードを以下に貼り付けられJavaでのベクトルの使用

import java.io.*; 
import java.util.*; 

class Chain { 
    static final int NPREF = 2; // size of prefix 
    static final String NONWORD = "\n"; 
        // "word" that can't appear 
    Hashtable statetab = new Hashtable(); 
        // key = Prefix, value = suffix Vector 
    Prefix prefix = new Prefix(NPREF, NONWORD); 
        // initial prefix 
    //Random rand = new Random(); 

// Chain build: build State table from input stream 
void build(BufferedReader in) throws IOException 
{ 
    StreamTokenizer st = new StreamTokenizer(in); 

    st.resetSyntax();      // remove default rules 
    st.wordChars(0, Character.MAX_VALUE); // turn on all chars 
    st.whitespaceChars(0, ' ');   // except up to blank 
    while (st.nextToken() != st.TT_EOF) 
     add(st.sval); 
    add(NONWORD); 
} 

// Chain add: add word to suffix list, update prefix 
void add(String word) 
{ 
    Vector suf = (Vector) statetab.get(prefix); 
    if (suf == null) { 
     suf = new Vector(); 
     statetab.put(new Prefix(prefix), suf); 
    } 
    suf.addElement(word); 
    prefix.pref.removeElementAt(0); 
    prefix.pref.addElement(word); 
} 

// Chain generate: generate output words 
void generate(int nwords, PrintWriter out, Vector <Integer> random_num) 
{ 
    prefix = new Prefix(NPREF, NONWORD); 
    for (int i = 0; i < nwords; i++) { 
     Vector s = (Vector) statetab.get(prefix); 
     if (s == null) { 
      System.err.println("Markov: internal error: no state"); 
      System.exit(1); 
     } 

     final int r = (random_num.get(i) % s.size()); 
     String suf = (String) s.elementAt(r); 
     if (suf.equals(NONWORD)) 
      break; 
     out.println(suf); 
     prefix.pref.removeElementAt(0); 
     prefix.pref.addElement(suf); 
    } 
} 
} 

class Prefix { 
    public Vector pref; // NPREF adjacent words from input 
static final int MULTIPLIER = 31; // for hashCode() 

// Prefix constructor: duplicate existing prefix 
Prefix(Prefix p) 
{ 
    pref = (Vector) p.pref.clone(); 
} 

// Prefix constructor: n copies of str 
Prefix(int n, String str) 
{ 
    pref = new Vector(); 
    for (int i = 0; i < n; i++) 
     pref.addElement(str); 
} 

// Prefix hashCode: generate hash from all prefix words 
public int hashCode() 
{ 
    int h = 0; 

    for (int i = 0; i < pref.size(); i++) 
     h = MULTIPLIER * h + pref.elementAt(i).hashCode(); 
    return h; 
} 

// Prefix equals: compare two prefixes for equal words 
public boolean equals(Object o) 
{ 
    Prefix p = (Prefix) o; 

    for (int i = 0; i < pref.size(); i++) 
     if (!pref.elementAt(i).equals(p.pref.elementAt(i))) 
      return false; 
    return true; 
} 

} 

class Markov { 
    static final int MAXGEN = 10000; // maximum words generated 
     static Vector <Integer> random_num = new Vector <Integer>(); 

     static BufferedReader random_reader; 
    public static void main(String[] args) throws IOException 
    {    

           BufferedReader in = new BufferedReader (new FileReader ("../alice30.txt")); 
           PrintWriter out = new PrintWriter (new FileWriter ("../output/markov_java_out.txt"));    
           BufferedReader random_reader = new BufferedReader (new FileReader ("../random_num.txt")); 
           String s; 
           s= random_reader.readLine(); 
           while(s != null) 
           { 
             int element = Integer.parseInt(s.trim()); 
             random_num.addElement(new Integer(element)); 
             s = random_reader.readLine(); 
           } 

     Chain chain = new Chain(); 
     int nwords = MAXGEN; 

     chain.build(in); 

       in.close(); 
     chain.generate(nwords,out, random_num); 
       out.close(); 
    } 
} 
+0

この宿題はありますか? –

+0

これはプログラミングのためのものです。質問を投稿できないのですか? – dawnoflife

+0

あなたは質問を投稿することができますが、宿題のように見えるものについて完全な回答を求める人は、軽蔑を期待することができます。 –

答えて

3

あなたはrandom_num.elementAt(i)をもしかして

1

このお試しください:?

import java.io.*; 
import java.util.Hashtable; 
import java.util.Vector; 

class Chain 
{ 
    static final int NPREF = 2; // size of prefix 
    static final String NONWORD = "\n"; 
    // "word" that can't appear 
    Hashtable statetab = new Hashtable(); 
    // key = Prefix, value = suffix Vector 
    Prefix prefix = new Prefix(NPREF, NONWORD); 
    // initial prefix 
    //Random rand = new Random(); 

    // Chain build: build State table from input stream 
    void build(BufferedReader in) throws IOException 
    { 
     StreamTokenizer st = new StreamTokenizer(in); 

     st.resetSyntax();      // remove default rules 
     st.wordChars(0, Character.MAX_VALUE); // turn on all chars 
     st.whitespaceChars(0, ' ');   // except up to blank 
     while (st.nextToken() != st.TT_EOF) 
     { 
      add(st.sval); 
     } 
     add(NONWORD); 
    } 

    // Chain add: add word to suffix list, update prefix 
    void add(String word) 
    { 
     Vector suf = (Vector) statetab.get(prefix); 
     if (suf == null) 
     { 
      suf = new Vector(); 
      statetab.put(new Prefix(prefix), suf); 
     } 
     suf.addElement(word); 
     prefix.pref.removeElementAt(0); 
     prefix.pref.addElement(word); 
    } 

    // Chain generate: generate output words 
    void generate(int nwords, PrintWriter out, Vector random_num) 
    { 
     prefix = new Prefix(NPREF, NONWORD); 
     for (int i = 0; i < nwords; i++) 
     { 
      Vector s = (Vector) statetab.get(prefix); 
      if (s == null) 
      { 
       System.err.println("Markov: internal error: no state"); 
       System.exit(1); 
      } 
      int r = ((Integer)random_num.get(i) % s.size()); 
      String suf = (String) s.elementAt(r); 
      if (suf.equals(NONWORD)) 
      { 
       break; 
      } 
      out.println(suf); 
      prefix.pref.removeElementAt(0); 
      prefix.pref.addElement(suf); 
     } 
    } 
} 

class Prefix 
{ 
    public Vector pref; // NPREF adjacent words from input 
    static final int MULTIPLIER = 31; // for hashCode() 

    // Prefix constructor: duplicate existing prefix 
    Prefix(Prefix p) 
    { 
     pref = (Vector) p.pref.clone(); 
    } 

    // Prefix constructor: n copies of str 
    Prefix(int n, String str) 
    { 
     pref = new Vector(); 
     for (int i = 0; i < n; i++) 
     { 
      pref.addElement(str); 
     } 
    } 

    // Prefix hashCode: generate hash from all prefix words 
    public int hashCode() 
    { 
     int h = 0; 

     for (int i = 0; i < pref.size(); i++) 
     { 
      h = MULTIPLIER * h + pref.elementAt(i).hashCode(); 
     } 
     return h; 
    } 

    // Prefix equals: compare two prefixes for equal words 
    public boolean equals(Object o) 
    { 
     Prefix p = (Prefix) o; 

     for (int i = 0; i < pref.size(); i++) 
     { 
      if (!pref.elementAt(i).equals(p.pref.elementAt(i))) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

} 

class Markov 
{ 
    static final int MAXGEN = 10000; // maximum words generated 
    static Vector random_num = new Vector(); 
    static BufferedReader random_reader; 

    public static void main(String[] args) throws IOException 
    { 

     BufferedReader in = new BufferedReader(new FileReader("../alice30.txt")); 
     PrintWriter out = new PrintWriter(new FileWriter("../output/markov_java_out.txt")); 
     BufferedReader random_reader = new BufferedReader(new FileReader("../random_num.txt")); 
     String s; 
     s = random_reader.readLine(); 
     while (s != null) 
     { 
      int element = Integer.parseInt(s.trim()); 
      random_num.addElement(new Integer(element)); 
      s = random_reader.readLine(); 
     } 

     Chain chain = new Chain(); 
     int nwords = MAXGEN; 

     chain.build(in); 

     in.close(); 
     chain.generate(nwords, out, random_num); 
     out.close(); 
    } 
} 

私はArrayList<Integer>の代わりVectorをしようとお勧めします。

を私は「alice30.txt」のようなファイルを持っていないので、私はあなたのコードを実行することはできませんが、このスニペットは、フィンを実行しますeが書かれた:

import java.util.Arrays; 
import java.util.List; 
import java.util.Vector; 

public class Junk 
{ 

    public static void main(String[] args) 
    { 
     Vector random_num = new Vector() 
     {{ 
      add(4); 
      add(3); 
      add(1); 
     }}; 
     int i = 1; 
     List<Integer> s = Arrays.asList(new Integer []{1, 2, 3, 4, 5}); 
     // The next line looks just like the one I gave you 
     int r = ((Integer)random_num.get(i) % s.size()); 
     System.out.println(r); 
    } 
} 
+0

これで、random_num.elementAt(i)を使用すると、 "演算子%はjava.lang.Object、intに適用できません"というエラーが表示されます。 – dawnoflife

+0

これは私があなたに与えたコードではありません。その行を次のようにします。int r =((Integer)random_num.get(i)%s.size()); – duffymo

+0

申し訳ありませんが、このスレッドを使用してjsutを開始して間違ったコメントを貼り付けました。私はあなたのコードを試して、これは私が得るエラーです。 "operator%はjava.lang.Integer、int" – dawnoflife

1

あなたはVectorに配列構文を使用するので、あなたが貼り付けコードはコンパイルされません。

static Vector<Integer> random_num = new Vector<Integer>(); 

またアレイではなく、一致する方法generate(...)にパラメータを変更し、最終的にVectorようrandom_numを処理することによって、この方法を修正する:として

final int r = (random_num.get(i) % s.size()); 

マルコフにこのようなVectorを宣言するJava 5があなたのコレクションをタイプする能力を利用していないことに気付きました。これにより、明示的なキャストの必要性を防ぐことができ、一般的には良い方法と考えられています。このようなあなたのハッシュテーブルを宣言してみてください。

Hashtable<Prefix, Vector<String>> statetab = new Hashtable<Prefix, Vector<String>>(); 

読むthis参照

のためにここではあなたがより多くの思考を与える必要が除いてコピーコンストラクタを、アップ固定のすべてとコードがあります:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.io.StreamTokenizer; 
import java.util.Hashtable; 
import java.util.List; 
import java.util.Vector; 

class Chain { 
    static final int NPREF = 2; 
    static final String NONWORD = "\n"; 
    Hashtable<Prefix, Vector<String>> statetab = new Hashtable<Prefix, Vector<String>>(); 
    Prefix prefix = new Prefix(NPREF, NONWORD); 

    void build(final BufferedReader in) 
      throws IOException { 
     final StreamTokenizer st = new StreamTokenizer(in); 

     st.resetSyntax(); // remove default rules 
     st.wordChars(0, Character.MAX_VALUE); // turn on all chars 
     st.whitespaceChars(0, ' '); // except up to blank 
     while (st.nextToken() != StreamTokenizer.TT_EOF) { 
      add(st.sval); 
     } 
     add(NONWORD); 
    } 

    // Chain add: add word to suffix list, update prefix 
    void add(final String word) { 
     Vector<String> suf = this.statetab.get(this.prefix); 
     if (suf == null) { 
      suf = new Vector<String>(); 
      this.statetab.put(new Prefix(this.prefix), suf); 
     } 
     suf.addElement(word); 
     this.prefix.pref.removeElementAt(0); 
     this.prefix.pref.addElement(word); 
    } 

    // Chain generate: generate output words 
    void generate(final int nwords, final PrintWriter out, final List<Integer> random_num) { 
     this.prefix = new Prefix(NPREF, NONWORD); 
     for (int i = 0; i < nwords; i++) { 
      final Vector<String> s = this.statetab.get(this.prefix); 
      if (s == null) { 
       System.err.println("Markov: internal error: no state"); 
       System.exit(1); 
      } 
      final int r = (random_num.get(i) % s.size()); 
      final String suf = (String) s.elementAt(r); 
      if (suf.equals(NONWORD)) { 
       break; 
      } 
      out.println(suf); 
      this.prefix.pref.removeElementAt(0); 
      this.prefix.pref.addElement(suf); 
     } 
    } 
} 

class Prefix { 
    public Vector<String> pref; // NPREF adjacent words from input 
    static final int MULTIPLIER = 31; // for hashCode() 

    // Prefix constructor: duplicate existing prefix 
    Prefix(final Prefix p) { 
     //this.pref = p.pref.clone(); 
    } 

    // Prefix constructor: n copies of str 
    Prefix(final int n, final String str) { 
     this.pref = new Vector<String>(); 
     for (int i = 0; i < n; i++) { 
      this.pref.addElement(str); 
     } 
    } 

    // Prefix hashCode: generate hash from all prefix words 
    @Override 
    public int hashCode() { 
     int h = 0; 
     for (int i = 0; i < this.pref.size(); i++) { 
      h = MULTIPLIER * h + this.pref.elementAt(i).hashCode(); 
     } 
     return h; 
    } 

    // Prefix equals: compare two prefixes for equal words 
    @Override 
    public boolean equals(final Object o) { 
     final Prefix p = (Prefix) o; 
     for (int i = 0; i < this.pref.size(); i++) { 
      if (!this.pref.elementAt(i).equals(p.pref.elementAt(i))) { 
       return false; 
      } 
     } 
     return true; 
    } 

} 

public class Markov { 
    static final int MAXGEN = 10000; // maximum words generated 
    static List<Integer> random_num = new Vector<Integer>(); 
    static BufferedReader random_reader; 

    public static void main(final String[] args) 
      throws IOException { 

     final BufferedReader in = new BufferedReader(new FileReader("../alice30.txt")); 
     final PrintWriter out = new PrintWriter(new FileWriter("../output/markov_java_out.txt")); 
     final BufferedReader random_reader = new BufferedReader(new FileReader("../random_num.txt")); 
     String s; 
     s = random_reader.readLine(); 
     while (s != null) { 
      final int element = Integer.parseInt(s.trim()); 
      random_num.add(new Integer(element)); 
      s = random_reader.readLine(); 
     } 
     final Chain chain = new Chain(); 
     final int nwords = MAXGEN; 
     chain.build(in); 
     in.close(); 
     chain.generate(nwords, out, random_num); 
     out.close(); 
    } 
} 
+0

:ライン45: Line63期待:私は、私は次のエラーを取得し、あなたの提案の変更を行った後、「)」 ライン予想:109:欠落しているメソッドの本体、または 抽象を宣言: ライン45を期待を 行:123:シンボルを解決できません シンボル:変数random_num – dawnoflife

+0

どのようなエラーが発生しましたか? –

+0

元の質問のコードを変更して更新できますか?また、大きな問題を抱えていることに気付きました。クローン()メソッドをオーバーライドすることを選択しました... –

関連する問題