【问题标题】:Sorting an Array of Objects throws long[] error对对象数组进行排序会引发 long[] 错误
【发布时间】:2014-12-11 17:50:43
【问题描述】:

我正在关注MKyong sort examples

我有 AGRinformesActivos 类覆盖 compareTo() 方法来按 riesgoTotal double 对我的类进行排序。

public class AGRinformesActivos extends EntidadBase implements Comparable<AGRinformesActivos>{

private static final long   serialVersionUID    = -4341418821044868087L;

private String                  tipoActivo          = "";
private String                  codigo              = "";
private String                  denominacion        = "";
private int                     idAmenaza           = 0;
private double                  impactoTotal        = 0;
private double                  riesgoTotal         = 0;
private int                     valorPendiente      = 0;
ArrayList<Double>               impactoCuali        = new ArrayList<Double>();
ArrayList<String>               impactoCuanti       = new ArrayList<String>();
ArrayList<Double>               riesgoCuali         = new ArrayList<Double>();
ArrayList<String>               riesgoCuanti        = new ArrayList<String>();

使用compareTo() 版本在 asc 中订购:Sort array of object by particular member inside the object/class

public int compareTo(AGRinformesActivos o) {
    return new Double(this.riesgoTotal).compareTo(new Double(o.riesgoTotal));
}

这是我的代码:

    ArrayList <AGRinformesActivos> datosTotal = new ArrayList<AGRinformesActivos>();
    List listadoActTotal = manager.dameListadoActivos( Integer.parseInt(info.getIdtipoActivo().trim()), info.getCodigo().trim());
for( Object o : listadoActTotal ) {
                fila = (List) o;                    
                String codigoActivo = fila.get( 0 ).toString();             
                // If exists we obtain, if not exists we create.
                if (activosDimension.containsKey( codigoActivo )){
                    // If exists, obtain from activosDimension
                    informesActivo = activosDimension.get( codigoActivo );
                }else{
                    informesActivo = new AGRinformesActivos();
                    activosDimension.put( codigoActivo, informesActivo );
                    // Al objeto le añado tipoActivo, idActivo y Denominación
                    String tipoActivo = manager.dameNombreTipoActivo(info.getIdtipoActivo());
                    informesActivo.setTipoActivo( tipoActivo );
                    informesActivo.setCodigo( codigoActivo );
                    informesActivo.setDenominacion( fila.get( 1 ).toString() );
                    }
                    // Add impactoTotal and riesgoTotal
                    informesActivo.setImpactoTotal( Double.parseDouble( fila.get( 2 ).toString() ) );
                    informesActivo.setRiesgoTotal( Double.parseDouble(fila.get( 3 ).toString() ) );
                }

                informesActivo.getImpactoCuali().add( Double.parseDouble(fila.get( 5 ).toString() ) );
                informesActivo.getRiesgoCuali().add( Double.parseDouble(fila.get( 6 ).toString() ) );

                String gradoImp = dameRangoEconGrado(Double.parseDouble(fila.get( 5 ).toString() ));
                String gradoRiesg = dameRangoEconGrado(Double.parseDouble(fila.get( 6 ).toString() ));              
                if(gradoImp.equals("") ){
                    gradoImp = dameRangoEconGrado(1);
                }
                informesActivo.getImpactoCuanti().add( gradoImp );
                if(gradoRiesg.equals( "" )){
                    gradoRiesg = dameRangoEconGrado(1);
                }
                informesActivo.getRiesgoCuanti().add( gradoRiesg );

                if (!datosTotaltemp.contains( informesActivo )){
                    datosTotaltemp.add( informesActivo );
                    datosTotal.add( informesActivo );
                }
            }
Arrays.sort(datosTotal);

...

当代码到达Arrays.sort(datosTotal);时抛出错误:

The method sort(long[]) in the type Arrays is not applicable for the arguments (ArrayList<AGRinformesActivos>)
] con causa raíz
java.lang.Error: Unresolved compilation problem: 
    The method sort(long[]) in the type Arrays is not applicable for the arguments (ArrayList<AGRinformesActivos>)

    at com.dominion.procop.agr.struts.actions.AGRInformes.buscarActivosEmpty(AGRInformes.java:270)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

我做错了什么? AGRinformesActivos 有一个静态长。这是问题吗?为什么?在我的 compareTo 中,我使用了 riesgoTotal 的双倍。

提前谢谢你

【问题讨论】:

  • 您正在排序 Collection,而不是数组。试试Collections.sort() 而不是Arrays.sort()
  • ^^ 并提供Comparator&lt;AGRinformesActivos, AGRinformesActivos&gt;的实现:Collections.sort(datosTotal, new Comparator&lt;AGRinformesActivos, AGRinformesActivos&gt;...;
  • “Arrays 类型中的方法 sort(long[]) 不适用于参数 (ArrayList)”!您使用ArrayList 调用排序方法,但它需要long[]。并且...不要运行有编译错误的代码。
  • @Keppil 已更改,现在可以正常工作。你可以发布一个答案来给你积分吗?非常感谢,我没看到。
  • @Victor:当类实现Comparable 时,不需要Comparator

标签: java arrays sorting object arraylist


【解决方案1】:

您的datosTotal 引用是一个集合,而不是一个数组。所以你不应该使用Arrays对其进行排序,而应该使用Collections.sort

为了效率,我也建议你使用

public int compareTo(AGRinformesActivos o) {
    return Double.compare(this.riesgoTotal,o.riesgoTotal);
}

而不是为每次比较创建两个新的 Double 对象。

【讨论】:

    【解决方案2】:

    您正在排序一个集合,而不是一个数组。试试Collections.sort() 而不是Arrays.sort()

    【讨论】:

      【解决方案3】:

      Arrays.sort 无法对 ArrayList 进行排序。尝试使用Collections.sort

      【讨论】:

        猜你喜欢
        • 2022-10-14
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 2018-08-06
        相关资源
        最近更新 更多