我想为一个包编写一个方法来获取像this这样的层次结构中包含的类,但是对于无限数量的超类型。 没有超类型的方法在列表的开头,并且最后扩展了类。
我的方法受到冒泡排序的启发,并检查邻居是否是其中一种超类型,如果是,则交换类。
List<GenClass> getOrderedGenClasses() {
List<GenClass> classes = new ArrayList<>(getGenClasses()); //the unordered classes
for (int i=0; i<classes.size(); i++){ //the bubble sort approach to check e
for (int j=i+1; j<classes.size(); j++){
List<GenClass> superclasses = classes.get(i).getBaseGenClasses(); //gets the superclasses for comparison
for(int k=0; k<superclasses.size();k++) { //just checks if the superclass is contained
if (superclasses.get(k).getName() == classes.get(j).getName()){
Collections.swap(classes, i, j); //if it is contained swap the neighbours
break;
}
}
}
}
return classes;
}
对于某些类它可以工作,但有些仍然没有正确的顺序。我做错了什么?
答案 0 :(得分:1)
实际的问题可能在这里:
superclasses.get(k).getName() == classes.get(j).getName()
使用equals()方法比较字符串;不是通过使用== !!!
但除此之外,基本答案(对于&#34;我在这里做错了什么&#34;)是:你不使用TDD。
TDD是针对此类问题的完美技术。你看,你(希望)有非常明确的要求。
你可以/应该通过&#34;简单地&#34;通过将它们放入测试用例来明确您的要求。然后添加代码以完成该测试。然后你写下一个测试。等等...
这简单地避免了你现在面临的情况:你有一堆(复杂的)生产代码,它似乎有时,但不是&#34;所有的时间&#34; 。你不知道从哪里开始。
但是,让我们给你一些更具体的建议:研究分离问题。您正在混合该代码中的不同职责。
您应该拥有一个方法/类,以便&#34;收集&#34;包中的所有类/接口。没有排序,只要确保你得到你想要找到的那些课程。
然后,您编写以某种方式对该集合起作用的代码。通过这样做,您还可以更轻松地进行小而清晰的测试 - 更容易测试一个&#34;类&#34;收集器&#34;,与测试&#34;排序类收集器&#34;。