当前位置:编程学习 > JAVA >>

求助周五交作业!!!实在搞不定了!!!

自定义一个链表,在通过该链表的数组实现hash功能
这个是链表类
package NewLinkedList;
//自定义的链表
import java.io.*;

public class NewLinkedList {

private String word;
private int count;
private int index;
private NewLinkedList next;

public NewLinkedList(String w, int j) {

//一个node含有的元素
//word存的词
//index索引号
//count计数
//next指向下一个链表

word = w;
index = j;
count = 0;
next = null;

}

public void setWord(String w) {

// 存单词
if (w.equals(word)) {
count++;
} else if (next != null) {
next.setWord(w);
} else {
next = new NewLinkedList(w, index + 1);
next.setWord(w);
}

}

public boolean isWord(String w) {
boolean flag = false;
if (w.equals(word)) {
flag = true;
} else if (next != null) {
flag = next.isWord(w);
}
return (flag);
}

public int getCount(String w) {

// 得到单词数目
if (w.equals(word)) {
return count;
} else if (next != null) {
next.getCount(w);
return count;
} else {
return 0;
}

}

public int getLength() {

// 得到长度
if (next != null) {
next.getLength();
return index;
} else {
return index;
}
}

public String getWord(int j) {

// 取单词
if (j == index) {
return word;
} else if (next != null) {
return word;
} else {
return null;
}
}

public String toString() {

// 打印
String r = index + " " + word + " " + count;
if (next != null) {
System.out.println(word + " " + count);
}
return r;
}


哈希函数类
public class HashFunction {

HashFunction() {

}

public static int getIndexByFisrtLetter(String w) {
return 0;
}

public static int getIndexByDivision(String w, int d) {
return 0;
}

public static int getIndexByknuth(String w, int d) {
return 0;

}
}

class FirstLetter extends HashFunction {
public static int getIndexByFisrtLetter(String w) {
int lineIndex = 0;
if (w != null) {
char ch = w.charAt(0);
lineIndex = Character.getNumericValue(ch);
}
return lineIndex;

}
}

class DivisionMethod extends HashFunction {
public static int getIndexByDivision(String w, int d) {

int a = 0;
if (w != null) {
char[] strChar = w.toCharArray();
for (int i = 0; i < strChar.length; i++) {
Character ch = new Character(strChar[i]);
a = ch.getNumericValue(strChar[i]);
}
}
return (a % d);
}
}

class Knuth extends HashFunction {
public static int getIndexByknuth(String w, int d) {
int a = 0;
if (w != null) {
char[] strChar = w.toCharArray();
for (int i = 0; i < strChar.length; i++) {
Character ch = new Character(strChar[i]);
a = ch.getNumericValue(strChar[i]);
}
}
return (a * (a + 3) % d);
}

}


哈希表类
package NewLinkedList;

//自定义的哈希表
import sheffield.EasyReader;
import NewLinkedList.HashFunction.*;

public class NewHash {
private String words;
private int j;
private int dividend;
private FirstLetter fl;
private NewLinkedList[] hash = new NewLinkedList[dividend];

public NewHash(String w, int d) {
words = w;
dividend = d;

}

// 以首字母为key存字符串
public void sotreWordsWithFirstLetter(String w) {
for (int i = 0; i <= dividend; i++) {
if (i == fl.getIndexByFisrtLetter(w)) {
hash[i].setWord(w);
}
}
}

public String getWords(String w) {
int n = fl.getIndexByFisrtLetter(w);
return hash[n].getWord(n);
}

public int getCount(String w) {
int n = fl.getIndexByFisrtLetter(w);
return hash[n].getCount(w);
}

public void displayHash() {
for (int i = 0; i < hash.length + 1; i++) {
hash[i].toString();
}
}

}


主函数类

package NewLinkedList;

import java.util.Enumeration;
import java.util.Hashtable;

import NewLinkedList.*;
import sheffield.EasyReader;

public class WordList {

public static void main(String[] args) {
read();

}

public static void read() {
// open a file
EasyReader file = new EasyReader("small.txt");

String w = null;
FirstLetter fl = null;

int totalNumberOfWords = 0;
NewHash ht;

// process line by line
while (!file.eof()) {

// read a string
String s = file.readString();

// remove leading/trailing white spaces & place a space in the end
s = s.trim() + ' ';

// find the length of the string
int l = s.length();

// repeat until all spaces are processed
while (l > 0) {

// find the position of the first space
int i = s.indexOf(' ');

// identify the leading word and the rest of the string
w = s.substring(0, i);
s = s.substring(i + 1, l);

// display words
if (w.length() > 0) {
ht = new NewHash(w, 100);
System.out.print(w);
totalNumberOfWords++;

ht.sotreWordsWithFirstLetter(w);
System.out.println(fl.getIndexByFisrtLetter(w));

}

// find the length of the string
l = s.length();
}
}
}

}


目前报错:
aprilException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at NewLinkedList.NewHash.sotreWordsWithFirstLetter(NewHash.java:24)
at NewLinkedList.WordList.read(WordList.java:54)
at NewLinkedList.WordList.main(WordList.java:12)

small.txt 的文件内容:
april thirtieth nineteen ninety six
he was standing outside the door and wanted to see me so i said come on in
nineteen seventy eight he comes to the professor looking to publish a fiery essay
it was about ecology technology the dangers of technology
but the would be author is spurned
he was furious
he was shaking he had such anger
but he actually said he was going to get even
he was going to get even is what he said yes
nineteen ninety four the professor calls the f. b. i. and then
you got no response from the f. b. i.
number
no follow up phone call
number
nothing
if ted kaczynski is indeed the unabomber that call might have led to his early arrest nearly two years ago
tonight the exclusive story
this is a. b. c. news nightline
reporting from washington ted koppel
there is an obvious reason why magicians so jealously guard the tricks and illusions of their trade
it is one thing after all to admire the dexterity with which such illusions are performed but without the mystery there is no magic
now that much of the country appears convinced that ted kaczynski and the unabomber are one and the same it may already be a little difficult to remember how desperately law enforcement agencies were looking for even the tiniest clue to his identity
everything now seems to have fallen so neatly into place that you find yourself asking how it could have taken this long where was the mystery
of course what looks easy and obvious now was just an impenetrable fog only a few months ago and let me add this cautionary note
when you are being inundated as the f. b. i. was with thousands upon thousands of false leads and pointless tips it is easy to understand how a legitimate and important piece of information could have slipped between the cracks
even so a. b. c.'s chief investigative correspondent brian ross has found someone who tried to pass on information that might have cracked the unabomber case nearly two years ago
he tried but nobody was listening
if indeed ted kaczynski is the unabomber professor don saari the former chairman of the mathematics department at northwestern university says he thinks he knows what got kaczynski started something until tonight professor saari had only talked about with the f. b. i.
professor when did you first meet the man you believe was ted kaczynski
february nineteen seventy seven
he dropped in to see me in my office
he was standing outside the door and wanted to see me so i said come on in
just dropped in
just dropped in
in what was the first of several visits by kaczynski professor saari told a. b. c. news that the at first shy kaczynski warmed to him and in early nineteen seventy eight asked for the professor's help on a project
well at this time he had a manuscript and it was about ten to twelve maybe twenty pages at most long
he wanted help in getting it published
and what was the manuscript about
well it was about ecology technology and the dangers of technology
similar to the so called manifesto of the unabomber
it had resemblance to it yes very similar in many cases
but this was in nineteen seventy eight
this was nineteen seventy eight
at that point from what is known kaczynski had already spent six or seven years as a kind of nineteenth century mountain man in his rustic montana cabin never letting on that he had gone to harvard had a p. h. d. from michigan and had taught mathematics at the university of california in berkeley
and he tried to create the image of being a worker and so i felt that i just assumed from his statements that here is an individual who couldn't afford to go to school was bright but couldn't afford to go to school and so i was trying to help him to go to school
he was interested in peddling his manuscript
professor saari said kaczynski seemed to be modeling himself after eric hoffer the self educated longshoreman whose book the true believer was popular in certain intellectual circles
he got quite excited very very excited i can still see his arms moving out and i can just see his excitement and he says you read eric hoffer and it was quite clear from or at least i guessed from his comments at that time that his goal was to become the next eric hoffer a working class philosopher
in fact the unabomber's manifesto makes several specific references to hoffer's book the true believer quote at present all we can say is no true believer will make a safe recruit to the revolution unless his commitment is exclusively to the destruction of technology professor saari says he didn't think much of kaczynski's writings but admired his enthusiasm
i liked him


--------------------编程问答-------------------- EasyReader 是老师给的方法。。。。。
/**
* EasyReader
* Provides a 易做图 inte易做图ce for text stream input 
* @author Guy J Brown
* Contains some code from Jim McGregor's SimpleReader class (used with permission)
* First version 16/2/2000
* Modification history:
* Modified 19/1/2001 to fix bug with readChar, which now ignores carriage return character
*/

package sheffield;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class EasyReader extends BufferedReader {

// instance variables

private boolean endOfFile = false;
private boolean startOfFile = true;
private char bufferChar = ' ';

// Constructors

/**
* Create a new EasyReader that reads from standard input
*/
public EasyReader() {
super(new InputStreamReader(System.in));
}

/**
* Create a new EasyReader that reads from a text file
* @param s the name of the text file
*/
public EasyReader(String s) {
super(new InputStreamReader(getFileInputStream(s)));
}

// Private methods

private static FileInputStream getFileInputStream(String s) {
FileInputStream f = null;
try {
f = new FileInputStream(s);
}
catch (IOException e) {
error("file not found");
}
return f;
}

private static void error(String s) {
System.err.println("Error in EasyReader - "+s);
System.err.flush();
System.exit(0);
}

private void prompt(String p) {
System.err.print(p);
System.err.flush();
}

private void getNextChar() {
if (!endOfFile) {
int c=0;
try {
c=read();
}
catch (IOException e) {
error("could not read another character");
}
if (c==-1) 
endOfFile=true;
else
bufferChar=(char)c;
}
}

// methods

/**
* Check whether the end of the input stream has been reached
* @return true if the end of the stream is reached
*/
public boolean eof() {
return endOfFile;
}

/**
* Read a character from the input stream
* @return a character value
*/
public char readChar() {
if (startOfFile) {
startOfFile=false;
getNextChar();
}
char ch;
do {
ch = bufferChar;
getNextChar();
} while (ch=='\n');
return ch;
}

/**
* Read a character from the input stream, with a prompt
* @param s the prompt
* @return a character value
*/
public char readChar(String s) {
prompt(s);
return readChar();
}

/**
* Read a string from the input stream
* @return a string value
*/
public String readString() {
while (!endOfFile && (bufferChar==' ' || bufferChar=='\r' || bufferChar=='\n'))
getNextChar();
String s = "";
while (!endOfFile && (bufferChar!='\r' && bufferChar!='\n')) {
s+=bufferChar;
getNextChar();
}
return s;
}

/**
* Read a string from the input stream, with a prompt
* @return a string value
*/
public String readString(String s) {
prompt(s);
return readString();
}

/**
* Read a double from the input stream
* @return a double value
*/
public double readDouble() {
double x = 0;
try {
x=(new Double(readString())).doubleValue();
}
catch (Exception e) {
error("invalid floating point number");
}
return x;
}

/**
* Read a double from the input stream, with a prompt
* @return a double value
*/
public double readDouble(String s) {
prompt(s);
return readDouble(); 
}

/**
* Read a float from the input stream
* @return a float value
*/
public float readFloat() {
float x = 0;
try {
x=(new Float(readString())).floatValue();
}
catch (Exception e) {
error("invalid floating point number");
}
return x;
}

/**
* Read a float from the input stream, with a prompt
* @return a float value
*/
public float readFloat(String s) {
 prompt(s);
 return readFloat();
 }
 
/**
* Read an integer from the input stream
* @return an integer value
*/
public int readInt() {
int x = 0;
try {
x=(new Integer(readString())).intValue();
}
catch (Exception e) {
error("invalid integer number");
}
return x;
}

/**
* Read an integer from the input stream, with a prompt
* @return an integer value
*/
public int readInt(String s) {
prompt(s);
return readInt();
}

/**
* Read a boolean from the input stream
* @return a boolean value
*/
public boolean readBoolean() {
char c = readString().charAt(0);
return (c=='t' || c=='T');
}

/**
* Read a boolean from the input stream, with a prompt
* @return a boolean value
*/
public boolean readBoolean(String s) {
prompt(s);
return readBoolean();
}
}
--------------------编程问答-------------------- 第一个数组越界问题,改小于应该就可以了

    public void sotreWordsWithFirstLetter(String w) {
        for (int i = 0; i < dividend; i++) {
            if (i == fl.getIndexByFisrtLetter(w)) {
                hash[i].setWord(w);
            }
        }
    }
--------------------编程问答-------------------- 大爱空指针和数组下表越界这两个异常了,因为他俩是最好定位和解决的问题。 --------------------编程问答-------------------- 空指针和数组下表越界
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,