【问题标题】:Issue with Sorting ArrayList using Collection使用 Collection 对 ArrayList 进行排序的问题
【发布时间】:2014-10-19 16:57:27
【问题描述】:

我正在尝试使用其参数之一对 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();
        }
});

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

【问题讨论】:

标签: java sorting collections arraylist comparator


【解决方案1】:

您不必返回比较器中的最大值,而是例如减去它们:

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

【讨论】:

    【解决方案2】:

    如果您查看 compare() 的 Javadoc,您可以了解它的预期工作方式:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        好吧,由于我们没有您的代码的某些部分,并且我们也没有堆栈跟踪,所以我将尝试帮助您解决我所拥有的。

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

        Comparator 是一个接口,这就是为什么你在实例化它的同时实现 compare 方法,我们称之为“匿名类”。 Collections.sort 将使用您在 compare 方法中实现的规则对其进行排序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-10
          相关资源
          最近更新 更多