Рекурсия сортировки Python Bubble. Что я делаю не так?

Поскольку AbstractStringBuilder не является public class, не спрашивая разработчиков, почему они его написали, можно только предположить ...

Спекуляция

Обратите внимание, что StringBuffer ],

Потоковая, изменяемая последовательность символов.

добавлена ​​в 1.0. StringBuilder Javadoc читает

Изменчивая последовательность символов. Этот класс предоставляет API, совместимый с StringBuffer, но без гарантии синхронизации. Этот класс предназначен для использования в качестве замены для замены StringBuffer в местах, где строковый буфер использовался одним потоком (как это обычно бывает). По возможности рекомендуется, чтобы этот класс использовался по сравнению с StringBuffer, поскольку он будет быстрее в большинстве реализаций.

(выделено мной) и добавлен в 1.5. Идея состоит в том, что в большинстве случаев этот класс является улучшением StringBuffer, но в целом очень похож на функциональность (может заменить друг друга). Как замечают @immibis и @MadProgrammer в комментариях, идея наследования экономит массу неприятностей в тех случаях, когда вы хотите схожие функции.

Я нашел один простой пример в методе append(String). В StringBuilder это

@Override
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

В StringBuffer это

@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

, а в AbstractStringBuilder -

public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}

Мы видим, что единственная разница между поточно-безопасными и небезопасными версиями - это некоторый контроль кеша (toStringCache), но оба они называют один и тот же метод в своем суперклассе, следовательно, повторно используют код через наследование.

Аналогия

Подумайте об этом, как о том, что вы - один код. Вы создаете класс dog, который включает анатомическую структуру собаки (уши, хвост, 4 ноги ...) и методы, связанные с ее действием, такие как bark. Через 5 лет вы хотите создать класс cat для представления кошки. Вы начнете с нуля? Нет, вы создали бы abstract class FourLeggedAnimal со структурой ушей, хвоста, 4 ножек и т. Д. И с помощью метода makeSound. Затем вы продолжите этот класс и используйте все эти сходства в обоих подклассах, переопределив при необходимости (bark и meow).

В чем смысл создавая бесполезную оболочку StringBuilder?

будет таким же, как кто-то спрашивает вас

В чем смысл создания бесполезной оболочки Cat?

< / BLOCKQUOTE>
-1
задан papercutbut 13 July 2018 в 19:55
поделиться

2 ответа

Я запустил код с соответствующим отступом, как показано ниже, и получил правильный вывод.

def recursiveSort(sensor_list,n,t): #Recursive Sort
    if n == 0:
        return sensor_list
    for i in range(n-1):
        if sensor_list[i][t] > sensor_list[i + 1][t]:
            temp = sensor_list[i]
            sensor_list[i] =sensor_list[i + 1]
            sensor_list[i + 1] = temp

    return recursiveSort(sensor_list,n - 1,t)

Dict = {'4213' : ('STEM Center', 0),
'4201' : ('Foundations Lab', 1),
'4204' : ('CS Lab', 2),
'4218' : ('Workshop Room', 3),
'4205' : ('Tiled Room', 4),
'out' :  ('Outside', 5),
}

sensor_list=[]

[sensor_list.append((key,Dict[key][0],Dict[key][1])) for key in Dict ] #Adding values to a dictionary into a tuple using list comprehension

print sensor_list


print recursiveSort(sensor_list,len(sensor_list),0)

print recursiveSort(sensor_list,len(sensor_list),1)

print sensor_list

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

if n == 0:
    return sensor_list
    for i in range(n-1):
        if sensor_list[i][t] > sensor_list[i + 1][t]:
            temp = sensor_list[i]
            sensor_list[i] =sensor_list[i + 1]
            sensor_list[i + 1] = temp

Цикл for не выполняется вообще, потому что

  • при n == 0, поскольку оператор return перед циклом
  • , когда n! = 0, потому что часть цикла цикла находится внутри блока if.

И, вероятно, ваш оператор return recursiveSort(sensor_list,n - 1,t) также вышел из отступ.

1
ответ дан Nipun Sampath 17 August 2018 в 12:11
поделиться
  • 1
    Спасибо вам за то, что исправил эту ошибку. Я довольно новичок в python, поэтому не знаю, как исправить некоторые вещи. – papercutbut 13 July 2018 в 20:38
  • 2
    Также вы бы знали, как упорядочить список рекурсивно вторым номером кортежа, как в 1,2,3,4,5? – papercutbut 13 July 2018 в 20:39
  • 3
    print recursiveSort (sensor_list, len (sensor_list), 2) – Nipun Sampath 13 July 2018 в 20:43
def recursiveSort(sensor_list,n,t): #Recursive Sort
if (n == 0):

    return sensor_list
else:
    for i in range(n-1):
        if sensor_list[i][t] > sensor_list[i + 1][t]:
            temp = sensor_list[i]
            sensor_list[i] =sensor_list[i + 1]
            sensor_list[i + 1] = temp


    return recursiveSort(sensor_list,n - 1,t)

      Dict = {'4213' : ('STEM Center', 0),
    '4201' : ('Foundations Lab', 1),
   '4204' : ('CS Lab', 2),
    '4218' : ('Workshop Room', 3),
   '4205' : ('Tiled Room', 4),
       'out' :  ('Outside', 5),
   }

    sensor_list=[]

       [ sensor_list.append((key,Dict[key][0],Dict[key][1])) for key in Dict ] #Adding 
      values to a dictionary into a tuple using list comprehension

     print(sensor_list)


    print recursiveSort(sensor_list,len(sensor_list),0)

   print recursiveSort(sensor_list,len(sensor_list),1)

   print sensor_list
0
ответ дан claymorehack 17 August 2018 в 12:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: