Всем привет!
Помогите, пожалуйста, разобраться со сравнением Character.
В коде, который прикрепил, в строке 52 сравнение значений пришлось делать через .equals.
Если применить оператор '==', то даже когда alphabet.get(i) и listChar.get(j) вернут одинаковые символы, например 'a', выражение всё равно будет false.
При этом в строке 63 я тоже сравниванию символы через оператор '==' и в этой строке возвращается true если значения alphabet.get(i) и pair.getKey() возвращают одинаковый символ.
Сначала я предположил, что так как значения возвращаемые alphabet.get(i) и listChar.get(j) имеют ссылочный тип Character, то оператором '==' я сравниваю ссылки на них, а они всегда будут разными, поэтому и возвращается всегда false.
Но с другой стороны в строке alphabet.get(i) тоже возвращает Character и по идее также к сравнению оператором '==' идёт ссылка на объект, а когда в этой строке alphabet.get(i) вернёт 'a' и pair.getKey() вернёт, то результатом будет true.
Совсем запутался, помогите, пожалуйста, распутаться :(
package com.javarush.task.task10.task1012;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
/*
Количество букв
*/
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// Алфавит
List<Character> alphabet = Arrays.asList(
'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж',
'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о',
'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц',
'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
// Ввод строк
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
String s = reader.readLine();
list.add(s.toLowerCase());
}
// переводим введённые с клавиатуры слова в список символов
ArrayList<Character> listChar = new ArrayList<Character>();
for (int i = 0; i < list.size(); i++) {
char[] tmp = list.get(i).toCharArray();
for (char c : tmp) {
listChar.add(c);
}
}
//Создание и заполнение мапы алфавитом (ключи) и нулями (значения) для подсчёта
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < alphabet.size(); i++) {
map.put(alphabet.get(i), 0);
}
/* подсчёт количества букв.
первый цикл - перебор алфавита
вложенный цикл - перебор списка введённых символов
каждая буква алфавита сравнивается со всеми введенными символами
если значения алфавита и списка совпадают - увеличивает значение мапы на 1 в соответсвии с ключом
*/
for (int i = 0; i < alphabet.size(); i++) {
for (int j = 0; j < listChar.size(); j++) {
if (alphabet.get(i).equals(listChar.get(j))) {
int tmp = map.get(alphabet.get(i));
map.put(alphabet.get(i), tmp+1);
}
}
}
// вывод мапы на экран в алфавитном порядке
for (int i =0; i < alphabet.size(); i++) {
for (Map.Entry<Character, Integer> pair : map.entrySet()) {
if (alphabet.get(i) == pair.getKey()) {
System.out.print(pair.getKey());
System.out.println(" " + pair.getValue());
}
}
}
}
}