我用的eclipse
版本是3.1.1
的英文版。假设源程序是这样:
package c08;
publicclass StrSortVector {
private Vector v = new Vector();
Compare compare = new Compare();
class Compare {
publicboolean lessThan(Object l, Object r) {
return ((String) l).toLowerCase().compareTo(
((String) r).toLowerCase()) < 0;
}
publicboolean lessThanOrEqual(Object l, Object r) {
return ((String) l).toLowerCase().compareTo(
((String) r).toLowerCase()) <= 0;
}
}
privatebooleansorted = false;
publicvoid addElement(String s) {
v.addElement(s);
sorted = false;
}
public String elementAt(int index) {
if (!sorted) {
sort();
sorted = true;
}
return (String) v.elementAt(index);
}
public Enumeration elements() {
if (!sorted) {
sort();
sorted = true;
}
returnv.elements();
}
publicvoid sort() {
quickSort(0, v.size() - 1);
System.out.println("size=" + (v.size() - 1));
}
privatevoid quickSort(int left, int right) {
if (right > left) {
Object o1 = elementAt(right);
int i = left - 1;
System.out.println("i=" + i);
int j = right;
System.out.println("j=" + j);
while (true) {
while (compare.lessThan(elementAt(++i), o1))
;
while (j > 0)
if (compare.lessThanOrEqual(elementAt(--j), o1))
break; // out of while
if (i >= j)
break;
swap(i, j);
}
swap(i, right);
quickSort(left, i - 1);
quickSort(i + 1, right);
}
}
privatevoid swap(int loc1, int loc2) {
Object tmp = elementAt(loc1);
v.setElementAt(elementAt(loc2), loc1);
v.setElementAt(tmp, loc2);
}
// Test it:
publicstaticvoid main(String[] args) {
StrSortVector sv = new StrSortVector();
sv.addElement("d");
sv.addElement("A");
sv.addElement("C");
sv.addElement("c");
sv.addElement("b");
sv.addElement("B");
sv.addElement("D");
sv.addElement("a");
Enumeration e = sv.elements();
while (e.hasMoreElements())
e.nextElement();
}
}// /:~
为了容易看,所以先要ctrl+shift+f格式化一下。有红叉号,怀疑有什么没导进来,于是ctrl+shift+o来import 一下。值得一提的是ctrl+shift+o执行的是组织导入( organize import),就是说缺少导入,可以自动添加;有无用导入,可以自动删除。
好了,编译通过了。
代码中的方法有点乱是吧。试着来将代码整理一下,鼠标放在代码上,
首先我想进行代码重构。
将下面这段代码选中:
class Compare {
publicboolean lessThan(Object l, Object r) {
return ((String) l).toLowerCase().compareTo(
((String) r).toLowerCase()) < 0;
}
publicboolean lessThanOrEqual(Object l, Object r) {
return ((String) l).toLowerCase().compareTo(
((String) r).toLowerCase()) <= 0;
}
}
右键点击refactor - -Convert Member Type To Top Level。在弹出的对话框里输入抽出的类的名称Compare,OK即可。
我还想将类Compare中的方法中提取出接口,于是:将要提取的方法选中,右键单击extract Interface。输入接口名ICompare,在要提取的方法名上打勾,OK.
鼠标放在代码上,右键点击run as Java Application .运行报错。错误信息如下:Exception in thread "main" java.lang.StackOverflowError
at c08.StrSortVector.sort(StrSortVector.java:35)
at c08.StrSortVector.quickSort(StrSortVector.java:41)
at c08.StrSortVector.elementAt(StrSortVector.java:20)
点击控制台上的(StrSortVector.java:35)链接,找到出错的地方。
public Enumeration elements() {
if (!sorted) {
sort();
sorted = true;
}
returnv.elements();
}
这个方法里的quickSort(0, v.size() - 1);出错了。Ctrl+/将其注释掉。运行通过了,可是没有结果。将程序改一下,将结果打印:main函数里最后一句e.nextElement();前加Sy然后按alt+/,可以自动补全为System然后打 . 最终打出System.out.println(e.nextElement());
运行一下,发现结果只是把数据原样输出。这个类是要实现排序的。所以alt+←返回历史纪录。把注释掉内容再按一次alt+/打开。
既然quickSort(0, v.size() - 1);这个方法有错误,就选中quickSort按住alt键转到此方法,在错误提示里说(StrSortVector.java:41)有错,这正好是在quickSort方法中,看来是同一个错误,此行Object o1 = elementAt(right);又调用一个方法。选中elementAt按住ctrl转到这个方法中,StrSortVector.java:20
正好在此方法中,看来提示根本都是一个错误。20行sort();有错,将其注释掉。运行通过,结果按字母排序完成。
其实一般喜欢用debug来查找错误。但当把debug关了,就会找不到代码文件原来的位置。此时可以在代码上右健点击Show In - -navigator。就可以定位此文件了。
posted on 2008-03-01 11:42
静儿 阅读(2636)
评论(4) 编辑 收藏 所属分类:
技术