使用Collection对ArrayList进行排序的问题

时间:2014-08-26 11:20:56

标签: java sorting collections arraylist comparator

我正在尝试使用其中一个参数对VariantOptionData ArrayList进行排序。

这是我的VariantOptionData

public class VariantOptionData  implements java.io.Serializable 
{

   private Collection<VariantOptionQualifierData> variantOptionQualifiers;
   private StockData stock;
   private NGCPSizeEnum cs2;
}

我想使用cs2参数对此列表进行排序。我这样做..

List<VariantOptionData> allSizes = Converters.convertAll(style.getVariants(), getVariantOptionDataConverter());

Collections.sort(allSizes, new Comparator<VariantOptionData>()
{
        @Override
        public int compare(final VariantOptionData s1, final VariantOptionData s2)
        {
            return Integer.parseInt(s1.getCs2().getCode()) < Integer.parseInt(s1.getCs2().getCode()) ? s1.getCs2().getCode() : s2.getCs2().getCode();
        }
});

我知道它错了,但我正在尝试这样的事情,但却无法理解Comparators究竟是如何工作的。 cs2是一个枚举字段,其代码为增量值。我想使用Integer.parseInt(s1.getCs2().getCode())递增顺序对此列表进行排序。请帮忙

4 个答案:

答案 0 :(得分:2)

您必须返回比较器中的最大值,但是,例如减去:

@Override
        public int compare(final VariantOptionData s1, final VariantOptionData s2)
        {
            return Integer.parseInt(s1.getCs2().getCode()) - Integer.parseInt(s2.getCs2().getCode());
        }

答案 1 :(得分:1)

如果您查看compare()的Javadoc,您可以了解它的工作原理:

  

比较它的两个参数的顺序。当第一个参数小于,等于或大于第二个参数时,返回负整数,零或正整数。

要遵循此规则,您需要做的只是一个简单的减法:

    @Override
    public int compare(final VariantOptionData s1, final VariantOptionData s2)
    {
        return Integer.parseInt(s1.getCs2().getCode()) - Integer.parseInt(s2.getCs2().getCode());
    }

答案 2 :(得分:1)

它无效的原因是compare方法错误。如果两个元素相等,则需要返回以下内容:0;如果第一个值小于第二个值,则返回负值;如果第一个值大于第二个值,则返回正值。

@Override
public int compare(final VariantOptionData s1, final VariantOptionData s2) {
        return Integer.parseInt(s1.getCs2().getCode()) - Integer.parseInt(s2.getCs2().getCode());
}

答案 3 :(得分:0)

好吧,因为我们没有代码的某些部分,而且我们也没有堆栈跟踪,所以我会尽力帮助你。

您的代码看起来不错,您只需要在compare方法中返回一个数字,我就可以看到您需要VariantOptionData中cs2属性的getter方法,它必须有一个“代码“属性也是。

Comparator是一个接口,这就是为什么你在实现比较方法时实现它,我们称之为“匿名类”。 Collections.sort会根据您在compare方法中实施的规则对其进行排序。