我是一個Java新手,嘗試構建一個程序,該程序使用數據結構對給定文本文件的唯一字進行計數。爲了實踐,我自己實現了數據結構和抽象類。但是,當我運行該程序時,當涉及到add方法是MyArrayList時,我陷入了無限循環。繼續陷入無限循環(Java)
這種情況下的對象是一個SingleWord對象,由字符串字和整數計數組成,以跟蹤頻率。我沒有包括這個類在這裏創建對象。
public class MyArrayList<E> extends MyAbstractList<E> {
public static final int INITIAL_CAPACITY = 16;
private E[] data = (E[])new Object[INITIAL_CAPACITY];
/** Create a default list */
public MyArrayList() {
}
/** Create a list from an array of objects */
public MyArrayList(E[] objects) {
for (int i = 0; i < objects.length; i++)
add(objects[i]); // Warning: don’t use super(objects)!
}
@Override /** Add a new element at the specified index */
public void add(int index, E e) {
ensureCapacity();
// Move the elements to the right after the specified index
for (int i = size - 1; i >= index; i--)
data[i + 1] = data[i];
// Insert new element to data[index]
data[index] = e;
// Increase size by 1
size++;
}
/** Create a new larger array, double the current size + 1 */
private void ensureCapacity() {
if (size >= data.length) {
E[] newData = (E[])(new Object[size * 2 + 1]);
System.arraycopy(data, 0, newData, 0, size);
data = newData;
}
}
@Override /** Clear the list */
public void clear() {
data = (E[])new Object[INITIAL_CAPACITY];
size = 0;
}
@Override /** Return true if this list contains the element */
public boolean contains(E e) {
for (int i = 0; i < size; i++)
if (e.equals(data[i])) return true;
return false;
}
@Override /** Return the element at the specified index */
public E get(int index) {
checkIndex(index);
return data[index];
}
private void checkIndex(int index) {
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException
("index " + index + " out of bounds");
}
@Override /** Return the index of the first matching element
* in this list. Return -1 if no match. */
public int indexOf(E e) {
for (int i = 0; i < size; i++)
if (e.equals(data[i])) return i;
return -1;
}
@Override /** Return the index of the last matching element
* in this list. Return -1 if no match. */
public int lastIndexOf(E e) {
for (int i = size - 1; i >= 0; i--)
if (e.equals(data[i])) return i;
return -1;
}
@Override /** Remove the element at the specified position
* in this list. Shift any subsequent elements to the left.
* Return the element that was removed from the list. */
public E remove(int index) {
checkIndex(index);
E e = data[index];
// Shift data to the left
for (int j = index; j < size - 1; j++)
data[j] = data[j + 1];
data[size - 1] = null; // This element is now null
// Decrement size
size--;
return e;
}
@Override /** Replace the element at the specified position
* in this list with the specified element. */
public E set(int index, E e) {
checkIndex(index);
E old = data[index];
data[index] = e;
return old;
}
@Override
public String toString() {
StringBuilder result = new StringBuilder("[");
for (int i = 0; i < size; i++) {
result.append(data[i]);
if (i < size - 1) result.append(", ");
}
return result.toString() + "]";
}
/** Trims the capacity to current size */
public void trimToSize() {
if (size != data.length) {
E[] newData = (E[])(new Object[size]);
System.arraycopy(data, 0, newData, 0, size);
data = newData;
} // If size == capacity, no need to trim
}
@Override /** Override iterator() defined in Iterable */
public java.util.Iterator<E> iterator() {
return new ArrayListIterator();
}
private class ArrayListIterator
implements java.util.Iterator<E> {
private int current = 0; // Current index
@Override
public boolean hasNext() {
return (current < size);
}
@Override
public E next() {
return data[current++];
}
@Override
public void remove() {
MyArrayList.this.remove(current);
}
}
public static StringWord compare(StringWord w1, StringWord w2, Comparator<StringWord> c) {
if(c.compare(w1.word,w2.word) > 0)
return w1;
else
return w2;
}
}
,這是我的抽象類
public abstract class MyAbstractList<E> implements MyList<E> {
protected int size = 0; // The size of the list
/** Create a default list */
protected MyAbstractList() {
}
/** Create a list from an array of objects */
protected MyAbstractList(E[] objects) {
for (int i = 0; i < objects.length; i++)
add(objects[i]);
}
/** Add a new element at the end of this list */
@Override
public void add(E e) {
add(size, e);
}
@Override /** Return true if this list contains no elements */
public boolean isEmpty() {
return size == 0;
}
@Override /** Return the number of elements in this list */
public int size() {
return size;
}
@Override /** Remove the first occurrence of the element e
* from this list. Shift any subsequent elements to the left.
* Return true if the element is removed. */
public boolean remove(E e) {
if (indexOf(e) >= 0) {
remove(indexOf(e));
return true;
}
else
return false;
}
}
,這是我的接口MYLIST
public interface MyList<E> extends java.lang.Iterable<E> {
/** Add a new element at the end of this list */
public void add(E e);
/** Add a new element at the specified index in this list */
public void add(int index, E e);
/** Clear the list */
public void clear();
/** Return true if this list contains the element */
public boolean contains(E e);
/** Return the element from this list at the specified index */
public E get(int index);
/** Return the index of the first matching element in this list.
* Return -1 if no match. */
public int indexOf(E e);
/** Return true if this list contains no elements */
public boolean isEmpty();
/** Return the index of the last matching element in this list
* Return -1 if no match. */
public int lastIndexOf(E e);
/** Remove the first occurrence of the element o from this list.
* Shift any subsequent elements to the left.
* Return true if the element is removed. */
public boolean remove(E e);
/** Remove the element at the specified position in this list
* Shift any subsequent elements to the left.
* Return the element that was removed from the list. */
public E remove(int index);
/** Replace the element at the specified position in this list
* with the specified element and returns the new set. */
public Object set(int index, E e);
/** Return the number of elements in this list */
public int size();
/** Return an iterator for the list */
public java.util.Iterator<E> iterator();
}
主要方法等
import java.io.*;
import java.util.*;
import javax.swing.JOptionPane;
public class DataStruc{
public static void main(String[] args) throws Exception{
boolean continueProcess = false;
Scanner input;
MyList<SingleWord> list = new MyArrayList<SingleWord>();
//prompt user for input
do {
input = readFile(continueProcess).useDelimiter("[^A-Za-z]+");
//process input(file)
while (input.hasNext()) {
list.add(new SingleWord(input.next()));
}
System.out.println(list);
//prompt user to continue input
int option = JOptionPane.showConfirmDialog(
null,
"Continue opening file?",
"Select an Option",
JOptionPane.YES_NO_OPTION);
continueProcess = (option == 0)? true : false;
} while(continueProcess);
}
public static Scanner readFile(boolean continueProcess) throws Exception{
String filename;
File file;
do {
filename = JOptionPane.showInputDialog("Enter file name:");
file = new File(filename);
if (file.exists()) { //if file exist, process the file
System.out.println("\"" + filename + "\"" + " is found.");
continueProcess = false;
} else if (filename == null) { //if user click cancel
System.exit(0);
} else if(filename.length() == 0) { //if user click yes without entering any value
System.out.println("No file name has been entered.");
System.out.println("Please try again.");
continueProcess = true;
}
else{ //if the file does not exist
System.out.println("File " +
"\"" + filename + "\"" +
" does not exist");
continueProcess = true;
}
} while(continueProcess);
return new Scanner(file);
}
}
類創建SingleWord對象
public class SingleWord{
private int count = 1;
private String word;
public SingleWord(String word){
this.word = word;
}
public String getWord() {
return word;
}
public int getCount() {
return count;
}
@Override
public String toString() {
return word;
}
}
對不起,謝謝你:'(
文本文件是在這裏:
的文章(以下簡稱藝術)是使用一個名詞,表示一個字(或前綴或後綴)名詞形式的參考類型。文章指定名詞的語法定義,在某些語言中擴展到數量或數量範圍。英文文章是和/或(某些情況下)一些。 'An'和'a'是古代英語'an'的現代形式,在盎格魯方言中,它是數字'one'(在撒克遜方言中'比較'),並以數字'ane'存活到現代蘇格蘭人中。 'on'(被諾曼人重寫爲'one')和'an'存活到現代英語中,其中'one'用作數字,'an'('a',以輔音開頭的名詞前)作爲無限期的文章。他們是「a」
這是你的調試器非常擅長幫助你解決的問題。 – 2014-09-01 17:27:21
構造函數public MyArrayList(E [] objects)''可以簡單地調用'super(objects);'而不是像超類構造函數那樣做。 – Tom 2014-09-01 17:29:24
您不會向我們展示您的'main',輸入文本文件內容,代碼的其他部分以及它所在的循環的位置。所有這些缺少的部分使它(可能)無法幫助您。 – alfasin 2014-09-01 17:29:41