Мутация попытки неизменяемых типов в цикле не поднимает SyntaxError? [Дубликат]

Если вы похожи на меня, когда я впервые начал использовать Java, я хотел использовать оператор «==» для проверки того, были ли два экземпляра String одинаковыми, но к лучшему или худшему это не правильный способ сделать это в Java.

В этом уроке я продемонстрирую несколько разных способов правильно сравнить строки Java, начиная с подхода, который я использую большую часть времени. В конце этого руководства по сопоставлению Java String я также обсужу, почему оператор «==» не работает при сравнении строк Java.

Вариант 1: Сравнение строк Java с методом equals Большая часть (возможно, в 95% случаев). Я сравниваю строки с методом equals класса Java String следующим образом:

if (string1.equals(string2))

Этот метод String равен методу для двух строк Java, и если они содержат точно такую ​​же строку символов, они считаются равными.

Взглянув на быстрый пример сравнения строк с методом equals, если был выполнен следующий тест, две строки не будут считаться равными, поскольку символы не являются точно такими же (случай символов различен):

String string1 = "foo";
String string2 = "FOO";

if (string1.equals(string2))
{
    // this line will not print because the
    // java string equals method returns false:
    System.out.println("The two strings are the same.")
}

Но, когда две строки содержат одну и ту же строку символов, метод equals вернет true, как в этот пример:

String string1 = "foo";
String string2 = "foo";

// test for equality with the java string equals method
if (string1.equals(string2))
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Вариант 2: Сравнение строк с методом equalsIgnoreCase

В некоторых строковых сравнительных тестах вы захотите игнорируйте, являются ли строки строчными или строчными. Если вы хотите проверить свои строки на равенство в этом случае нечувствительным образом, используйте метод equalsIgnoreCase класса String, например:

String string1 = "foo";
String string2 = "FOO";

 // java string compare while ignoring case
 if (string1.equalsIgnoreCase(string2))
 {
     // this line WILL print
     System.out.println("Ignoring case, the two strings are the same.")
 }

Вариант 3: сравнение строк Java с методом compareTo

Существует также третий, менее распространенный способ сравнения строк Java, и это с методом сравнения String класса. Если две строки точно совпадают, метод compareTo вернет значение 0 (ноль). Ниже приведен краткий пример того, как выглядит этот метод сравнения строк:

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Пока я пишу об этой концепции равенства в Java, важно отметить, что язык Java включает в себя метод equals в базовый класс Java Object. Всякий раз, когда вы создаете свои собственные объекты, и вы хотите предоставить средства для проверки того, являются ли два экземпляра вашего объекта «равными», вы должны переопределить (и реализовать) этот метод equals в своем классе (точно так же, как язык Java предоставляет это равенство / сравнение в методе String равно).

Вы можете посмотреть на это ==, .equals (), compareTo () и compare ()

1
задан coldspeed 14 December 2017 в 17:33
поделиться

3 ответа

Вы not , так сказать, изменяете список. Вы просто изменяете элементы в списке. Я не думаю, что это проблема.

Чтобы ответить на ваш второй вопрос, оба способа действительно разрешены (как вы знаете, с тех пор, как вы запускали код), но это будет зависеть от ситуации. Является ли содержание изменчивым или неизменным?

Например, если вы хотите добавить один из каждого элемента в список целых чисел, это не сработает:

>>> x = [1, 2, 3, 4, 5]
>>> for i in x:
...     i += 1
... 
>>> x
[1, 2, 3, 4, 5] 

Действительно, int s являются неизменяемыми объектами. Вместо этого вам нужно будет перебирать индексы и изменять элемент в каждом индексе, например:

>>> for i in range(len(x)):
...     x[i] += 1
...
>>> x
[2, 3, 4, 5, 6]

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

9
ответ дан coldspeed 16 August 2018 в 05:40
поделиться
  • 1
    Python перечисляет итерацию по индексу, поэтому да, удаление элементов (за исключением конца, используя отрицательный срез) во время итерации является потенциально опасным поведением: изменение их на месте, хотя и полностью безопасно. – Alexander Huszagh 1 July 2017 в 19:14
  • 2
    Да, звучит разумно. Я просто подумал, что произойдет, если внутри цикла for я начну создавать много дополнительных полей для объекта (или любых других операций, которые будут потреблять слишком много памяти и, следовательно, должны быть перераспределены), прежде чем закончить с этим объектом и перейти к следующему один. – dizcza 1 July 2017 в 19:18
  • 3
    @dizcza В python каждый бит памяти выделяется из кучи. Нет никакой гарантии, что смежные элементы внутри списка находятся где-то рядом друг с другом в реальной памяти. Это определенно не вызывает беспокойства. :) – coldspeed 1 July 2017 в 19:19

Конечно, вы можете. Первый способ является нормальным, но в некоторых случаях вы также можете использовать функции list или map() .

0
ответ дан BrightOne 16 August 2018 в 05:40
поделиться
  • 1
    Вы дали ответ, не сказав, почему, и бросаете вокруг терминов и понятий, не описывая, каким образом они были бы полезны OP каким-либо образом. – coldspeed 1 July 2017 в 19:16

Я знаю, что вы не должны добавлять / удалять элементы во время итерации по списку. Но могу ли я изменить элемент в списке, который я выполняю, если я не изменяю длину списка?

. Вы не изменяете список в любом пути в все. То, что вы изменяете , - это элементы в списке; Это прекрасно. Пока вы не меняете фактический список напрямую, вы в порядке.

Нет необходимости перебирать индексы. На самом деле это одностороннее. Если вы на самом деле пытаетесь изменить сам список, просто перебирайте список по значению.

Если да, будет ли следующий сниппл действительным?

lovely_numbers = [[41, 32, 17], [26, 55]]
for numbers_pair in lovely_numbers:
    numbers_pair.pop()
print(lovely_numbers)  # [[41, 32], [26]]
< / blockquote>

Абсолютно. По тем же причинам, что я сказал выше. Вы не изменяете сами lovely_numbers. Скорее всего, вы только изменяете элементы в lovely_numbers.

2
ответ дан Christian Dean 16 August 2018 в 05:40
поделиться
Другие вопросы по тегам:

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