2015-03-03 3 views
0

Я прочитал файл с городами и его населением, и я пытаюсь сортировать города по алфавиту с помощью сортировки вставки. Проблема в том, что он сортирует все элементы, кроме первого. Первое значение в несортированном списке остается в индексе [0] в отсортированном списке. Это код:Вставка Сортировка строк

int i, j; 
    String v; 
    for (i = 1; i < cities.size()-1; i++) 
    { 
     v = cities.get(i); 
     j = i; 
     while (cities.get(j-1).compareToIgnoreCase(v) > 0 && j >=2) 
     { 
      cities.set(j, cities.get(j-1)); 
      j--; 
     } 
     cities.set(j, v); 
    } 

Любая идея, что не так?

спасибо.

+0

'for (i = 1; i MadProgrammer

ответ

2

Во-первых, это ...

for (i = 1; i < cities.size()-1; i++) 

должны, вероятно, будет ...

for (i = 1; i < cities.size(); i++) 

Во-вторых, это ...

j = i; 

должны, вероятно, будет ...

int j = i - 1; 

В-третьих, это ...

while (cities.get(j - 1).compareToIgnoreCase(v) > 0 && j >= 2) { 

беспорядок. Вы пытаетесь и получить доступ к значению из List, прежде чем вы выяснить, если значение на самом деле доступным (т.е. если j находится в пределах диапазона List) и, вероятно, должно быть что-то больше похоже на ...

while ((j > -1) && (cities.get(j).compareToIgnoreCase(key) > 0)) { 

Сказав все что это будет означать, что cities.set(j, cities.get(j - 1)); должны стать cities.set(j + 1, cities.get(j)); и cities.set(j, v); должны стать cities.set(j + 1, key);

что-то вроде ...

List<String> cities = new ArrayList<>(25); 
    cities.add("D"); 
    cities.add("C"); 
    cities.add("B"); 
    cities.add("A"); 

    for (int i = 1; i < cities.size(); i++) { 
     String key = cities.get(i); 
     int j = i - 1; 
     while ((j > -1) && (cities.get(j).compareToIgnoreCase(key) > 0)) { 
      cities.set(j + 1, cities.get(j)); 
      j--; 
     } 
     cities.set(j + 1, key); 
    } 

например ...

+0

Благодарим вас за подробный ответ, но проблема была в таком состоянии. Он должен быть в обратном порядке следующим образом: j> 0 && cities.get (j-1) .compareToIgnoreCase (v)> 0 – Nik

+0

Еще раз за вашу подробную помощь! – Nik

+0

Я пробовал это изначально, но он, похоже, не работал, некоторые меня переработали весь код – MadProgrammer

3

Возможно, вы захотите for (i = 0; i < cities.size(); i++).

Доступ массивы и списки начинает отсчет от 0, но фактический размер списка/массива начинает отсчет 1.

Пример: Для того, чтобы получить доступ к первому (и единственный) элемент массива a размера 1, вы бы использовали a[0].

+0

Я не могу начать с i = 0, потому что j = 0, и я сравниваю элемент, который находится в индексе [j-1]. – Nik