2010-12-05 14 views
1

Ich habe an diesem Problem gearbeitet und es beinhaltet die Implementierung des Markov-Chain-Algorithmus in Java. Es gibt mir einen Fehler, wenn ich die Variable r dem Wert eines Vektorelements zuweise. (Linie 54) .Der Fehler liest „Array benötigt aber java.unit.Vector gefunden) Der folgende Code eingefügt wirdVerwendung von Vektoren in 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

Ist das Hausaufgaben? –

+0

ja, das ist für eine Programmierung assingment. ist es nicht erlaubt, Fragen zu stellen? – dawnoflife

+0

Sie dürfen Fragen stellen, aber diejenigen, die nach vollständigen Antworten für scheinbar Hausaufgaben fragen, können Verachtung erwarten. –

Antwort

3

Meinten Sie random_num.elementAt(i)

1

die Sie interessieren..?

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(); 
    } 
} 

ich würde empfehlen, ArrayList<Integer> statt Vector versuchen.

ich nicht Ihren Code ausführen kann, weil ich Dateien nicht wie „alice30.txt“, aber das snippet läuft fin e geschrieben:

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

Jetzt gibt es mir den Fehler "Operator% kann nicht auf java.lang.Object, int angewendet werden", wenn Sie random_num.elementAt (i) – dawnoflife

+0

verwenden Das ist nicht der Code, den ich Ihnen gab. Stellen Sie diese Zeile wie folgt dar: int r = ((Ganzzahl) random_num.get (i)% s.größe()); – duffymo

+0

Es tut mir leid, dass ich jsut begann, diesen Thread zu verwenden, also den falschen Kommentar eingefügt. Ich habe deinen Code ausprobiert und dies ist der Fehler, den ich bekomme. "operator% kann nicht auf java.lang.Integer, int" – dawnoflife

1

Der Code, den Sie nicht, weil Sie die Array-Syntax auf einem Vector verwenden geklebt werden kompilieren. In Markov die Vector wie folgt erklären:

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

Auch die Parameter der Methode generate(...) ändern, anzupassen und schließlich diese Methode beheben, indem random_num wie ein Vector, kein Array Behandlung:

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

Als Nebenbei bemerkt, habe ich bemerkt, dass Sie die Möglichkeiten von Java 5, Ihre Sammlungen einzugeben, nicht nutzen. Dies kann die Notwendigkeit eines expliziten Casting verhindern und wird allgemein als gute Praxis angesehen. Versuchen Sie, Ihre Hashtable wie folgt erklärt:

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

lesen this Referenz

Hier ist der Code ist mit allem, was oben geregelt außer der Kopierkonstruktor, die Sie brauchen mehr Gedanken zu geben:

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

@ Amir: nachdem ich Ihre Änderungswünsche habe ich die folgenden Fehler erhalten: Zeile 45: erwartet Line63: ')' erwartet Linie: 109: erwartet 45 Line: fehlende Methode Körper, oder erklären abstrakt Zeile: 123: Symbol kann nicht aufgelöst werden Symbol: variable random_num – dawnoflife

+0

Welche Fehler haben Sie bekommen? –

+0

Können Sie den Code in Ihrer ursprünglichen Frage mit den Änderungen aktualisieren, die Sie vorgenommen haben? Außerdem habe ich bemerkt, dass du viel größere Probleme hast. Sie haben entschieden, die clone() -Methode zu überschreiben ... –