我试图以两种不同的方式对arrayList进行排序,一种是通过arrayList中对象的区域进行排序,另一种是使用arrayList中对象的名称(shape1,shape2)进行排序。当我将它们打印到文件中时,对象看起来像这样:shape1 :( points,radius等等)area = 0.0并且形状继续存在。我尝试查看其他类似的问题,但都使用Collections.sort进行了回答。我不确定我应该使用这种方法。这是我正在使用的一些代码,可以给你一个想法:
for (int i =0; i <shapes.size();i++){
for (int j = 1; j<shapes.size(); j++){
if (shapes.get(i).getShape().area() > shapes.get(j).getShape().area())
{
//
}
else
{
//
}
}
}
我不知道该怎么做才能做到这一点。有什么指针吗?按名称排序我必须使用:
shapes.get(i).getName()
答案 0 :(得分:3)
解决方案1
您可以实现Comparable界面并使用Collections.sort(List list)进行排序。
public class Shape implements Comparable<Shape> {
@Override
public int compareTo(Shape o) {
if(o == null) {
return 1;
}
if(getName() == null || o.getName() == null) {
return 0;
} else if(getName() != null && o.getName() == null) {
return 1;
} else if(getName() == null && o.getName() != null) {
return -1;
}
return getName().compareTo(o.getName());
}
}
Collections.sort(shapes);
解决方案2
创建一个实现Comparator并使用Collections.sort(List list, Comparator c)
的类public class ShapeComparator implements Comparator<Shape> {
@Override
public int compare(Shape s1, Shape s2) {
if(s1 == null || s2 == null) {
return 0;
} else {
return s1.getName().compareTo(s2.getName());
}
}
}
Collections.sort(shapes, new ShapeComparator());
答案 1 :(得分:1)
答案 2 :(得分:1)
由于这是作业,我不会发布任何代码。
如果您不允许使用Arrays.sort
,则可以实现Selection Sort - 它非常简单,您已经在代码中编写了它的开头。想法是在i
上的外循环的每次迭代中使用i
上的内循环从shapes.size()
到j
中选择段中的最小元素,然后放置元素i
- 数组的位置。你的内循环应该是这样的:
for(int j = i+1 ; j<shapes.size(); j++)
// ^--- this is what's changed
现在根据您的if
条件,您可以将j
- 元素与i
交换,或者将其保留到位并继续。
要排序字符串,请在if
条件中使用compareTo
方法。
答案 3 :(得分:0)
我认为你应该使用这样的东西:
Collections.sort(shapes, new Comparator<Object>() {
public int compare(Object obj1, Object obj2) {
Shape shape1 = ((Shape) obj1).getShape();
Shape shape2 = ((Shape) obj2).getShape();
String name1 = ((Shape) obj1).getName();
String name2 = ((Shape) obj1).getName();
Double area1 = shape1.area();
Double area2 = shape2.area();
int areaCmp = area1 - area2;
if( areaCmp!= 0 ) {
return areaCmp;
}
return name1.compareTo(name2);
}
});
了解更多info