Что не так с Collections.sort? - PullRequest
1 голос
/ 05 июня 2009

У меня есть эти строки в ArrayList of String в произвольном порядке, но когда я вызываю Collections.sort (listReference), отсортированный результат неверен, почему 10 и 11 (последние 2 символа) предшествуют 07, 08, 09

12880  20090506054200001
12880  20090506054200002
12880  20090513070200003
12880  20090513070200004
12880  20090520202600005
12880  20090520202600006
12880  20090520232900010
12880  20090520232900011
12880  20090520232900007
12880  20090520232900008
12880  20090520232900009

Ответы [ 5 ]

9 голосов
/ 05 июня 2009

У меня отлично работает:

import java.util.*;

public class Test {

      public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("12880  20090506054200001");
        list.add("12880  20090506054200002");
        list.add("12880  20090513070200003");
        list.add("12880  20090513070200004");
        list.add("12880  20090520202600005");
        list.add("12880  20090520202600006");
        list.add("12880  20090520232900010");
        list.add("12880  20090520232900011");
        list.add("12880  20090520232900007");
        list.add("12880  20090520232900008");
        list.add("12880  20090520232900009");

        Collections.sort(list);

        for (String x : list) {
          System.out.println(x);
        }
      }
    }

Выход:

12880  20090506054200001
12880  20090506054200002
12880  20090513070200003
12880  20090513070200004
12880  20090520202600005
12880  20090520202600006
12880  20090520232900007
12880  20090520232900008
12880  20090520232900009
12880  20090520232900010
12880  20090520232900011

Вы абсолютно уверены, что в ваших записях 7/8/9 нет чего-то «странного» в другом месте (например, другой элемент пробела между 12880 и отметкой времени)?

Если нет, можете ли вы создать короткую, но полную программу, которая демонстрирует проблему?

3 голосов
/ 05 июня 2009

Хорошо, давайте начнем с основной предпосылки, что Collections.sort работает (см. "select" не нарушен ).

Ваши строки не должны сортироваться таким образом, и до сих пор несколько человек подтвердили, что они этого не делают. Так что может быть причиной вашей сортировки?

  • Вы передали пользовательский Comparator на sort()?
  • Строки действительно такие же, как вы показали? Все ли пробельные символы являются пробелами?

Можете ли вы опубликовать точный код, который дает этот результат?

2 голосов
/ 05 июня 2009

Два конца, заканчивающиеся на 10 и 11, вероятно, имеют пробелы вместо пробелов для пробелов. Вкладки сортируются перед пробелами.

Обновление: на самом деле я пробовал это, и те, у которых вкладки отсортированы прямо вверх страницы, что имеет смысл Таким образом, теория вкладок на самом деле не объясняет наблюдаемое поведение.

1 голос
/ 05 июня 2009

Работает нормально для этого модульного теста?

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.junit.Test;

public class SortTest {

    List<String> expectedList = Arrays.asList(
            "12880  20090506054200001",
            "12880  20090506054200002",
            "12880  20090513070200003",
            "12880  20090513070200004",
            "12880  20090520202600005",
            "12880  20090520202600006",
            "12880  20090520232900007",
            "12880  20090520232900008",
            "12880  20090520232900009",
            "12880  20090520232900010",
            "12880  20090520232900011");

    @Test
    public void testSort() {
        List<String> stringList = new ArrayList(expectedList);
        Collections.shuffle(stringList);
        // comment following line out, for the rare case that shuffle returns the original list
        // assertFalse(stringList.equals(expectedList));
        Collections.sort(stringList);
        assertTrue(stringList.equals(expectedList));        
    }
}
0 голосов
/ 05 июня 2009

Я выяснил, почему так себя ведет.

Я сортировал коллекции до выполнения String.format("%03d", sequence). Где последовательность - последние 3 символа каждой строки выше.

В итоге

  1. сортировка строки, когда последние символы были ... 7 8 9 1 (0) 1 (1).
  2. (после сортировки) записать его в форме 007, 008, 009, 010, 011.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...