Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中如何按对象的组件对对象的arrayList进行排序_Java - Fatal编程技术网

在java中如何按对象的组件对对象的arrayList进行排序

在java中如何按对象的组件对对象的arrayList进行排序,java,Java,我尝试以两种不同的方式对arrayList进行排序,一种是根据arrayList中对象的面积排序,另一种是根据arrayList中对象的名称(shape1,shape2)排序。当我将这些对象打印到一个文件中时,它们看起来是这样的:shape1:(点、半径等…)area=0.0,并且形状一直保持不变。我试着看其他类似的问题,但都是用Collections.sort回答的。我不确定我是否应该使用这种方法。下面是我正在使用的一些代码,让您了解: for (int i =0; i <shapes.

我尝试以两种不同的方式对arrayList进行排序,一种是根据arrayList中对象的面积排序,另一种是根据arrayList中对象的名称(shape1,shape2)排序。当我将这些对象打印到一个文件中时,它们看起来是这样的:shape1:(点、半径等…)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
        {
            //
        }
    }
}

看一看这个类和方法。

看一看这个类和方法。

因为这是家庭作业,所以我不会发布任何代码

如果不允许您使用
数组.sort
,您可以实现它-它非常简单,并且您已经在代码中编写了它的开头。想法是在
i
上的外循环的每次迭代中,使用
j
上的内循环从
i
shapes.size()
选择段中的最小元素,并将该元素放置在数组的第位。您的内部循环应该如下所示:

for(int j = i+1 ; j<shapes.size(); j++)
//          ^--- this is what's changed
        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);
            }
        });

因为这是家庭作业,所以我不会发布任何代码

如果不允许使用
array.sort
,您可以实现-它非常简单,并且您已经在代码中编写了它的开头。这个想法是在
i
上的外部循环的每次迭代中,从
i
shapes.size()中选择段中最小的元素
使用
j
上的内环,并将该元素放置在数组的
i
第个位置。内环应如下所示:

for(int j = i+1 ; j<shapes.size(); j++)
//          ^--- this is what's changed
        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);
            }
        });

用于(int j=i+1;j解决方案1

对象可以实现接口并用于排序

公共类形状实现可比较{
@凌驾
公共整数比较(o形){
如果(o==null){
返回1;
}
if(getName()==null | | o.getName()==null){
返回0;
}else if(getName()!=null&&o.getName()==null){
返回1;
}else if(getName()=null&&o.getName()!=null){
返回-1;
}
返回getName().compareTo(o.getName());
}
}
集合。排序(形状);
解决方案2

创建一个实现并使用

公共类ShapeComparator实现Comparator{
@凌驾
公共整数比较(形状s1、形状s2){
如果(s1==null | | s2==null){
返回0;
}否则{
返回s1.getName().compareTo(s2.getName());
}
}
}
排序(shapes,newshapecomparator());

解决方案1

对象可以实现接口并用于排序

公共类形状实现可比较{
@凌驾
公共整数比较(o形){
如果(o==null){
返回1;
}
if(getName()==null | | o.getName()==null){
返回0;
}else if(getName()!=null&&o.getName()==null){
返回1;
}else if(getName()=null&&o.getName()!=null){
返回-1;
}
返回getName().compareTo(o.getName());
}
}
集合。排序(形状);
解决方案2

创建一个实现并使用

公共类ShapeComparator实现Comparator{
@凌驾
公共整数比较(形状s1、形状s2){
如果(s1==null | | s2==null){
返回0;
}否则{
返回s1.getName().compareTo(s2.getName());
}
}
}
排序(shapes,newshapecomparator());

我认为您应该使用以下内容:

for(int j = i+1 ; j<shapes.size(); j++)
//          ^--- this is what's changed
        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);
            }
        });
Collections.sort(形状、新比较器(){
公共整数比较(对象obj1、对象obj2){
Shape shape1=((Shape)obj1).getShape();
Shape shape2=((Shape)obj2).getShape();
字符串名称1=((形状)obj1).getName();
字符串名称2=((形状)obj1).getName();
双面积1=形状1.面积();
双面积2=形状2.面积();
int AREA CMP=区域1-区域2;
如果(区域CMP!=0){
返回区CMP;
}
返回name1.compareTo(name2);
}
});

要了解更多信息,我认为您应该使用以下内容:

for(int j = i+1 ; j<shapes.size(); j++)
//          ^--- this is what's changed
        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);
            }
        });
Collections.sort(形状、新比较器(){
公共整数比较(对象obj1、对象obj2){
Shape shape1=((Shape)obj1).getShape();
Shape shape2=((Shape)obj2).getShape();
字符串名称1=((形状)obj1).getName();
字符串名称2=((形状)obj1).getName();
双面积1=形状1.面积();
双面积2=形状2.面积();
int AREA CMP=区域1-区域2;
如果(区域CMP!=0){
返回区CMP;
}
返回name1.compareTo(name2);
}
});

有关更多信息,请参见:
Shape tmp=shapes.get(i);shapes.set(i,shapes.get(j));shapes.set(j,tmp);
我如何将其放置在第i个位置?.add?或.set?@Milwaukoholic使用
set
。经典的交换是这样的:
Shape tmp=shapes.get(i);shapes.set(i,shapes.get(j));shapes.set(j,tmp);
我已经取消了
可比的
实现。缺少一个泛型参数,即(我假设)您所说的是“强类型”废话。也就是说,这两个实现都不能处理左侧
getName()