2014-10-15 5 views
1

Я пытаюсь отсортировать список объектов продукта по их useby Сроки, но некоторые объекты могут иметь свои Date useby = nullСортировка ArrayList по дате в Java

То, что я хочу сделать, это сортировать список по «useby «Даты» и поместите все объекты с Date useby = null внизу или в верхней части списка.

public static void sort() { 
     Collections.sort(list, new Comparator<Product>() { 
      public int compare(Product o1, Product o2) { 
       if (o1.getUseDate() == null || o2.getUseDate() == null) { 
        return 0; 
       } else { 
        return o1.getUseDate().compareTo(o2.getUseDate()); 
       } 
      } 
     }); 
    } 

Это мой код, и я не знаю, как это исправить.

ответ

3

if (o1.getUseDate() == null || o2.getUseDate() == null). Здесь вы проверяете, имеет ли одна из двух Product нулевая дата. Если даже один из них возвращает результат возврата 0, значит, Comparator будет считать их равными. Даже если только один из них имеет нулевую дату. Здесь вы, вероятно, захотите провести дополнительную проверку. Следующий код приведет к Product с null Даты ставятся в начале.

if(o1.getUseDate() == null && o2.getUseDate() == null) 
    return 0; //They are both null, both equal 
if(o1.getUseDate() == null && o2.getUseDate() != null) 
    return -1; // The first is null and the second is not, return the first as lower than the second 
if(o1.getUseDate() != null && o2.getUseDate() == null) 
    return 1; //The first is not null and the second is, return the first as higher than the second 
else 
    return o1.getUseDate().compare(o2.getUseDate()); //Return the actual comparison 

Это, очевидно, немного подробный, но это должно дать вам представление о том, что вы на самом деле ищете.

1

return 0; означает, что сравниваемые элементы равны (другими словами, их не следует менять).

В случае null s считает

  • возвращение 0, если оба значения null (первое значение таким же, как второе значение - не меняет)
  • возвращение -1 если первое значение null но второй является не нуль (первый элемент меньше второго - не обмениваться)
  • возвращает 1, если второе значение равно null, а первое не равно нулю (первый элемент больше второго - sw ап их)
1

compare От Javadoc:

Сравнивает свои два аргумента для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, поскольку первый аргумент меньше, чем или больше второго.

Но из этой строки кода:

if (o1.getUseDate() == null || o2.getUseDate() == null) { 
    return 0; 

мы можем видеть, что вы практически говорите компаратор рассматривать useDates как равных, когда по крайней мере один из них null, и это не то, что вы хотите.

Поскольку null означает «ничего», довольно странно сравнивать концепцию ничего с датой, но если вы хотите разрешить нулевые значения, тогда вам нужно правильно обработать эту ситуацию, в результате получив более vorbose-код:

if(o1.getUseDate() == null){ 
    return o2.getUseDate() == null ? 0 : -1; //or +1 if you want null values at the bottom of your list 
} 
if(o2.getUseDate() == null){ 
    return o1.getUseDate() == null ? 0 : -1; // or +1 ... 
} 
return o1.getUseDate().compare(o2.getUseDate()); // 2 non null dates, do a real comparison 
Смежные вопросы