package homework7_2;
import java.util.LinkedList;
import java.util.List;
/**
* 为了避免在holder类中实例化对象后又要设置head,故在WordNode中设置,为了避免死循环
* 只能在使用WordNode实例对象调用方法时,检查head是否设置,否则抛出异常。如果直接使
* 用Java JDK提供的LinkedList<T>类,将使代码量大大减少。本类模拟了LinkedList<T>部分
* 方法的实现。
* @author 秦金涛
* @version 1.0
*/
public class WordNode {
/**类的一些私有属性说明:
* @prama data:存储的单词值对
* @prama next:链表的节点
* @prama head:链表的头节点
* @prama size:链表的存储值个数
* */
private ItemSaved data;
private WordNode next = null;
private WordNode head = null;
private int size = 0;
public WordNode() {
this.setData(null);
}
/**
* 利用一个ItemSaved对象构造一个WordNode
* @param data:初始化ItemSaved值
* */
public WordNode(ItemSaved data) {
this.setData(data);
}
/**
* 利用一对英汉词对构造一个wordNode
* @param english:需要存储或查询的英文
* @param chinese:对应的中文单词
* */
public WordNode(String english, String chinese) {
data = new ItemSaved(english, chinese);
this.setData(data);
}
/**
* 根据给定的一个英文单词生成一个查询对象
* @param english : 需要查询的英文单词
* */
public WordNode(String english) {
String chinese = "";
data = new ItemSaved(english, chinese);
this.setData(data);
}
/**
* WordNode的私有方法,不能被外部对象访问和修改
* @return 无返回值
* */
private WordNode setHead() {
head = new WordNode();
return head;
}
/**
* 对于给定的一个下标查询词组,对出现的错误进行了处理。
* @param x:需要得到的词组的下标,从0开始。
* @return WordNode对象
* */
public WordNode getAt(int x) {
WordNode temp = head;
if (head == null) {
System.err.println("词库为空!!!");
temp = null;
} else if (x >= size || x < 0) {
System.err.println("查询的下标志越界!");
temp = null;
} else {
int index = 0;
while (index <= x) {
temp = temp.next;
index++;
}
}
return temp;
}
/**
* 本方法被封装,不对外提供使用。
* @param element:WordNode对象,用于添加
* @return 无返回值
* */
private void addIn(WordNode element) {
element.next = head.next;
head.next = element;
this.setSize(this.getSize() + 1);
}
/**
* 本方法将给定的英语词组存储。
* @param element:需要存储的对象
* @return boolean类型,成功为true,否则false.
* */
public boolean add(WordNode element) {
boolean flag = false;
if (head == null) {
this.setHead();
this.addIn(element);
flag = true;
} else {
this.addIn(element);
flag = true;
}
return flag;
}
/**
* 本方法通过给定的obj(WordNode)对象查询字典库是否存在相同对象。
* @param obj:需要查询的对象
* @return String:对应的汉语词组,若没有则返回空格
* */
public String check(WordNode obj) {
String result = null;
if (head == null) {
result = "";
} else {
WordNode temp = head;
while (temp != null) {
if (temp.getNext() != null && temp.getNext().equals(obj)) {
result = temp.getNext().getData().getChinese();
break;
}
temp = temp.getNext();
}
if (result == null)
result = "";
}
return result;
}
/**
* 覆写父类的toString)()方法,输出词库的单词组
* @param 无参数
* @return String : 所有词组
* */
public String toString() {
List<String> list = new LinkedList<String>();
WordNode temp = head;
while (temp != null) {
if (temp.getNext() != null) {
list.add(temp.getNext().getData().toString());
}
temp = temp.getNext();
}
return list.toString();
}
/**
* 覆写了父类中的equals()方法,用于查询对应的汉语词
* @param obj:比较的对象
* @return boolean:相同为true,否则false
* */
public boolean equals(Object obj) {
boolean flag = false;
WordNode in = (WordNode) obj;// Up cast
try {
if (this.getData().getEnglish().equals(in.getData().getEnglish())) {
flag = true;
}
} catch (Exception e) {
System.err.println("对象类型不同!");
}
return flag;
}
// 用于测试
// public static void main(String[] args) {
// WordNode list = new WordNode();
// WordNode element1 = new WordNode("USA", "美国");
// WordNode element2 = new WordNode("CN", "中国");
// WordNode element3 = new WordNode("UK", "英国");
// WordNode element4 = new WordNode("FRANCE", "法国");
// WordNode element5 = new WordNode("RUSS", "俄罗斯");
// WordNode element6 = new WordNode("GREEN", "希腊");
// WordNode element7 = new WordNode("SPAIN", "西班牙");
// WordNode element8 = new WordNode("GERMAN", "德国");
// // list.add(element1);
// System.out.println("\n----------------------------------");
// list.add(element1);
// list.add(element2);
// list.add(element3);
// list.add(element4);
// list.add(element5);
// list.add(element6);
// list.add(element7);
// list.add(element8);
// System.out.println(list.toString());
// System.out.println("第7个元素:" + list.getAt(6).getData().toString());
// WordNode element21 = new WordNode("GERMAN");
// System.out.println("查找功能验证:"+list.check(element21));
// System.out.println("存储的单词数目:"+list.getSize());
// }
/**
* 私有属性对应的一些setter和getter方法
* */
public ItemSaved getData() {
return data;
}
public void setData(ItemSaved data) {
this.data = data;
}
public WordNode getNext() {
return this.next;
}
public void setNext(WordNode next) {
this.next = next;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}