Посимвольное сравнение строк в java
Мне дали задание сравнить две строки посимвольно и вывести на экран отличающиеся символы. Как я понял String в Java не является массивом со строковыми символами(надеюсь правильно дал определение). Так как реализовать тогда такую задачу на Java?
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Посимвольное сравнение 2 файлов
Полное задание:Реализация посимвольного сравнения двух файлов или страниц в интернете. Выводить.
Сравнение слов в массиве строк Java
Добрый день! Помогите пожалуйста с задачей.) "В файле содержатся фамилии людей. Нужно считать их из.
Сравнение строк (String) в java. Мини гайд для начинающих
Всем привет! Одна из самых распространенных ошибок начинающих, выражаемая в очень частых темах.

Посимвольное сравнение строк
Как в C# сравнить две строки (тип string) посимвольно так, что результатом сравнения будет число.
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
Сообщение от Starlight_ 
String в Java не является массивом
еще как является
2495 / 1944 / 486
Регистрация: 17.02.2014
Сообщений: 9,239
у String есть метод toCharArray(), глянь на него))
295 / 468 / 86
Регистрация: 26.02.2018
Сообщений: 931
Записей в блоге: 2

Сообщение было отмечено Starlight_ как решение
Решение
Starlight_,
Вариант1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public static void main(String[] args){ String s = "dfgjsdrhgjsdrfhgjkdrfhgvui"; String s1 = "dfshdfhgfnfgnbfjkbndkldklf"; for(int i = 0; i Math.min(s.length(), s1.length()); i++){ String str = i Math.min(s.length(), s1.length()) - 1 ? s.substring(i, i + 1) : s.substring(i); String str1 = i Math.min(s.length(), s1.length()) - 1 ? s1.substring(i, i + 1) : s1.substring(i); if(!str.equals(str1)){ System.out.println("строка 1 символ" + i + " " + str + "-->" + "строка 2 символ" + i + " " + str1); } if(i == Math.min(s.length(), s1.length()) - 1){ i++; System.out.println(s.length() > i ? ("строка 1 субстрока" + s.substring(i) + "-->" + "строка 2 NON") : ("строка 2 субстрока" + s1.substring(i) + "-->" + "строка 1 NON")); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
public static void main(String[] args){ char[] s = "dfgjsdrhgjsdrfhgjkdrfhgvui".toCharArray(); char[] s1 = "dfshdfhgfnfgnbfjkbndkldklf".toCharArray(); for(int i = 0; i Math.min(s.length, s1.length); i++){ if(s[i] != s1[i]){ System.out.println("строка 1 символ" + i + " " + s[i] + "-->" + "строка 2 символ" + i + " " + s1[i]); } if(i == Math.min(s.length, s1.length) - 1){ i++; System.out.println(s.length > i ? ("строка 1 субстрока" + substring(s, i) + "строка 2 NON") : ("строка 2 субстрока" + substring(s1, i) + "строка 1 NON")); } } } private static String substring(char[] s1, int i) { String s = ""; for(int a = i; a s1.length; a++){ s += s1[a]; } return s; }
Класс String
чтение строк с клавиатуры
Объекты класса String, то есть строки, очень удобно склеивать друг с другом оператором плюс. Эта возможность введена специально для облегчения работы именно со строками, и для большинства других классов оператор плюс не определен.
String first_name = "Ivan"; String second_name = "Kuznetzov"; // С помощью оператора + можно склеивать строки - получится снова строка. // Эту строку можно сохранить в переменной, например, так: String full_name = first_name + " " + second_name; // Можно делать склейку прямо при распечатке System.out.println (first_name + " " + second_name); // Если написать строка плюс число, то число тоже приклеится к строке: int house_number = 204; String address = "Mayakovskaya street, " + house_number; System.out.println (address); // Распечатается: Mayakovskaya street, 204 // Можно использовать + и непосредственно при распечатке: double pi = 3.1415; System.out.println ("Число Пи примерно равно " + pi); // Также + хорош для перевода числа в строку: int number = 10; String str = number + ""; // приклеим 10 к пустой строке, получим строку '1', '0'
Ещё в классе String есть множество полезных функций. Например, уже знакомая нам charAt возвращает код символа, стоящего в строке под заданным номером. Нумерация как всегда в Java идет с нуля, а не с привычной единицы.
String name = "Ivan"; // charAt возвращает код символа под заданным номером. // Это именно код, поэтому charAt возвращает int, но его можно явно привести к char, // чтобы пользоваться уже как символом, в том числе распечатывать char c0 = (char) name.charAt (0); // с0 теперь равно 'I' - нулевой символ строки Ivan char c1 = (char) name.charAt (1); // с1 будет равно 'v' char c2 = (char) name.charAt (2); // с2 будет равно 'a' char c3 = (char) name.charAt (3); // с3 будет равно 'n' // в строке Ivan всего 4 символа, от нулевого до третьего, // поэтому обращение к четвертому повлечет ошибку: char c4 = (char) name.charAt (4); // исключение out of bounds, // то есть символ с индексом 4 вне границ строки. // На экране вы увидите красную надпись: "java.lang.StringIndexOutOfBoundsException: String index out of range: 4" // Не пугайтесь экрана с кучей непонятного текста - ищите ключевые знакомые куски // Например, IndexOutOfBounds точно означает выход за границу, а остальное уже детали
Строчки удобно считывать с клавиатуры с помощью уже знакомого класса Scanner:
Scanner myscan = new Scanner (System.in); // функция сканера next() возвращает очередное слово, // которое пользователь вводит с клавиатуры: String word = myscan.next (); // считать строчку до ближайшего пробела или enter // функция сканера next() считает целую строку до ближайшего enter: String line = myscan.nextLine ();
Для сравнения строк друг с другом в классе String есть функция equals. Она возвращает true, когда две строчки совпадают по буквам, и false, если хоть как-то отличаются. Обычный оператор сравнения == следует использовать только для переменных примитивных типов, таких как int, double, char, boolean. Для строк и вообще для объектов любых классов оператор == обычно будет работать неверно, но об этом в следующем блоке, где речь пойдёт о классах и объектах. Пока что лучше просто использовать equals вот так:
Scanner myscan = new Scanner (System.in); String line1 = myscan.nextLine (); // считать первую строчку с клавиатуры String line2 = myscan.nextLine (); // считать вторую строчку с клавиатуры if (line1.equals (line2) == true) System.out.println ("Были введены одинаковые строчки"); else System.out.println ("Были введены разные строчки"); // если в операторе if не указывать никакое сравнение, то // автоматически будет подразумеваться проверка выражения на истинность, // то есть == true допишется по умолчанию, даже если его не писать. // Так что следующие строчки делают то же самое, но запись чуть-чуть короче: if (line1.equals (line2)) // "если line1 равна line2, то" - код читается легче System.out.println ("Были введены одинаковые строчки"); else System.out.println ("Были введены разные строчки"); // Функция equals вызывается для какой-то заданной строчки: line1.equals () , // То есть вызов можно прочесть как "равна ли строка line 1?" // Сразу напрашивается - равна ли, а чему именно? Конечно другой строчке - // она указывается параметром функции equals.
Общий принцип работы с функциями строк.
Сначала вам нужно создать первую строчку String line1 = . явно указать её в двойных кавычках или прочесть её с клавиатуры через Scanner. Для этой строчки можно вызывать любые функции класса String через точку line1.имя_функции () . Если нужно, в скобках указываем параметры — числа, или другую строку. Как и раньше, чтобы использовать возвращаемое значение, его нужно объявить как переменную. Например, int res = line1.length (); позволит сохранить длину строки line1 в переменную res .
Чтобы описать, как устроена та или иная функция обычно приводят её прототип, то есть краткое описание. В прототипе слева указывается, каков тип возвращаемого значения функции, то есть она возвращает int, boolean, String или что-то ещё. Если же функция не возвращает ничего, то указывается английское слово «пустота» — void. После этого пишут имя функции, а затем в скобках её параметры.
Несколько прототипов функций класса String:
Функция boolean contains (String str) проверяет, содержится ли строчка-параметр в исходной строке и возвращает true, если содержится, и false иначе.
Функция int indexOf (String str) также ищет одну строчку или отдельную букву в другой строке и возвращает позицию, где именно вторая строчка встретилась в первой. Возвращает -1, если не встретилась совсем. Незаменимая вещь для любых текстовых редакторов и вообще работы с текстом.
Ещё вариант той же функции int indexOf (String str, int start_from) — делает то же самое, но ищет вхождение str только начиная с символа под номером start_from.
Функция int compareTo (String str) сравнивает одну строку с другой по принципу «как в словаре». То есть, для полностью равных строк возвращает ноль, если исходная строка шла бы в словаре раньше параметра, то функция вернет отрицательное число, а если позже — положительное.
Функция int length () возвращает длину строки, то есть количество символов в строке.
Функция String substring (int begin, int end) возвращает подстроку в заданных пределах. То есть, например, вы хотите работать не со всей строкой, а только с её частью, начиная с символа номер 5 и заканчивая символом номер 10, тогда пишем String res = line1.substring (5, 10);
В дополнение к уже описанной функции boolean equals (String str), сравнивающей строки на посимвольное равенство, есть ещё похожая функция boolean equalsIgnoreCase (String str), которая вернёт true, если строки одинаковые, но некоторые буквы указаны в одной строке заглавными, а в другой прописными.
Класс String специально сделан, чтобы хранить неизменяемые строки. Все функции от contains до substring не меняют содержимое данной строки, но могут генерировать новые строчки. Для изменения строк есть класс StringBuilder, но о нём пока рано вести речь.
Посмотрим пример на все эти функции сразу в коде:
// Мы могли бы считать строки с клавиатуры // Scanner myscan = new Scanner (System.in); // String line1 = myscan.nextLine (); // String line2 = myscan.nextLine (); System.out.println ("Введите адрес"); // Но сейчас для наглядности зададим конкретные значения: String address = "город Москва, улица Маяковская, дом 10"; // если в адресе есть слово "Москва", то . if ( address.contains ("Москва")) System.out.println ( "Совершите покупку всего за 100$" ); else System.out.println ( "Совершите покупку всего за 10$ " ); // шутка конечно :) // вычислим длину строки: int len = address.length (); System.out.println ("Вы ввели следующее количество символов: " + len); int begin = address.indexOf(","); // найдём первую запятую - с неё начинается улица в адресе System.out.println ("Первая запятая в тексте встречается на позиции " + begin); int end = address.indexOf(",", begin + 1); // искать вторую запятую после первой запятой String street = address.substring (begin+1, end); // выделим часть строчки с описанием улицы System.out.println ("Введенная улица: " + street); // распечатает "улица Маяковская"
В классе String есть одна функция, которую можно вызывать не для какой-то конкретной строки line1 или address, как было выше, а просто по имени класса String. Речь идёт о функции valueOf. Она принимает на вход число и возвращает его же, но в виде строки. Очень удобно, когда вам нужно перевести число в строку. Используется она так:
String number_str = String.valueOf (4.5); // было число double 4.5, а стала строка String number_str из трёх символов '4', '.', '5' // Java допускает и вызов через конкретный объект, как мы делали раньше: String line1 = "something"; String number_str2 = line1.valueOf (4.5); // так можно, но не обязательно // можно вызвать valueOf и для исходной строки line1, но смысла в этом мало - // всё равно line1 никак не используется. // Для таких функций можно просто указывать имя класса, в данном случае String //Можно вызывать valueIOf и для целых чисел и для других типов: String integer_str = String.valueOf (10); // вызывали прямо по имени класса String.valueOf // Функции, которые можно вызывать по имени класса называются статическими - static.
По логике вещей для valueOf нужен параметр — число, из которого потом будет получена строка, но никак не нужна сама исходная строка, ведь её ещё только предстоит сделать.
Фразу «строка класса String» формальнее можно пересказать как «объект класса String«. Точно также и для всех остальных классов можно создавать их объекты. Например, объектом класса File будет очередной файл на компьютере. То есть класс описывает целое понятие файлов в принципе, а объект класса — один конкретный файл в заданной папке. В будущих блоках мы научимся создавать свои собственные классы.
Функции, которым не нужно ничего знать о конкретном объекте называют статическими и обозначают ключевым словом static. Например, функции valueOf нужно знать число, из которого при вызове будет сделана новая строка, а вот исходная строчка просто не нужна и не уместна. Поэтому прототип этой функции будет выглядеть так:
static String valueOf (double number);
Слово static означает «статичный», то есть не меняющий. Например, в случае строк — никакая исходная строка не будет изменена, ведь она никак не участвует в вызове valueOf. Также не нужно вообще эту строку знать, поэтому её можно не указывать при вызове — вместо неё пишется просто имя класса String.
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Как посимвольно считать строку в java
Для того, чтобы считать строку посимвольно в Java , можно использовать метод toCharArray() класса String , который возвращает массив символов, представляющих строку. Затем можно перебирать элементы массива с помощью цикла for и обрабатывать их по мере необходимости.
Например, следующий код считывает строку с клавиатуры и выводит ее посимвольно в консоль:
import java.util.Scanner; public class Main public static void main(String[] args) Scanner scanner = new Scanner(System.in); System.out.print("Введите строку: "); String str = scanner.nextLine(); char[] charArray = str.toCharArray(); for (char c : charArray) System.out.println(c); > scanner.close(); > >
- В этом примере сначала создается объект Scanner для считывания ввода с клавиатуры.
- Затем пользователю предлагается ввести строку, которая сохраняется в переменной str .
- С помощью метода toCharArray() создается массив символов charArray , который затем перебирается с помощью цикла for-each .
- Как только все символы строки выведены, сканер закрывается с помощью метода close() .
Посимвольное чтение документа
Всем привет! Помогите разобраться. Нужно прочитать текстовый документ с матрицей символов и числом в конце. Вот пример:
o..o. ooooo..oo.. . o .o. oooo..oo..o. 54
Матрицу символов, соответственно, нужно записать в двумерную матрицу или список, а символы, к примеру, будут true(o)-false(.), либо байтовские 0(.)-1(o), либо enum, не суть. Число в конце нужно записать в переменную. Смог вычислить только размер матрицы, ширину и высоту:
private int width = 0; private int height = 0; public void read() < try(BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\life\\test.txt"))) < String value; while ((value = bufferedReader.readLine()) != null) < if (width == 0) < width = value.length(); >height++; > System.out.println("Ширина:" + width + " Высота:" + (height-1)); > catch (IOException e) < e.printStackTrace(); >>
Пробовал метод read(), но он перебирает сразу все символы до конца файла.
Посоветуйте, как сделать?
Отслеживать
задан 1 апр 2013 в 7:58
Руслан Лозицкий Руслан Лозицкий
29 5 5 бронзовых знаков
На C#: File.ReadLines(filename).Select(s => s.Select(c => c == ‘.’)) — Ах да, там ещё одна строка. Тогда так: var lines = File.ReadAllLines(filename); var matrix = lines.Take(lines.Count — 1)Select(s => s.Select(c => c == ‘.’)); var num = int.Parse(lines.Skip(lines.Count — 1).Single());
3 апр 2013 в 21:36
9 апр 2013 в 5:04
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
public class ReadMatrix < private int number; private boolean [][] matrix; public ReadMatrix ( int number, boolean [][] matrix ) < setNumber ( number ); setMatrix ( matrix ); >public boolean [][] getMatrix () < return matrix ; >public void setMatrix ( boolean [][] matrix ) < this.matrix = matrix ; >public int getNumber () < return number ; >public void setNumber ( int number ) < this.number = number ; >@Override public String toString () < return toString(matrix) + "\n" + number; >private String toString ( boolean [][] matrix ) < // or new StringBuilder (matrix.length * matrix [0].length) StringBuilder result = new StringBuilder () ; String [] lines = new String [matrix.length] ; for ( int i = 0 ; i < lines.length ; i++ ) < if (i != 0) < result.append ( "\n" ); >result.append ( toString(matrix[i]) ); > return result.toString () ; > private String toString ( boolean [] bs ) < StringBuilder result = new StringBuilder (bs.length) ; for ( int i = 0 ; i < bs.length ; i++ ) < result.append ( bs [i] ? 'o' : '.' ) ; >return result.toString (); > public static void main ( String [] args ) throws FileNotFoundException < // ReadMatrix matrix = getInstance ( System.in) ; ReadMatrix matrix = getInstance ( new FileInputStream ( "C:/test.txt" ) ) ; System.out.println (matrix) ; >public static ReadMatrix getInstance(InputStream inputStream) < // read file String[] lines = readFile(inputStream); // parse input int number = Integer.parseInt ( lines [lines.length - 1] ) ; boolean [][] matrix = null; for ( int i = 0 ; i < lines.length - 1 ; i++ ) < boolean [] tmp = parseLine(lines[i]); if (i == 0) < matrix = new boolean [lines.length][tmp.length]; >matrix[i] = tmp; > return new ReadMatrix (number, matrix); > private static String [] readFile ( InputStream inputStream ) < Listresult = new LinkedList < String >(); Scanner scanner = new Scanner ( inputStream ); while (scanner.hasNextLine ()) < result.add ( scanner.nextLine ().trim () ); >return result.toArray ( new String [result.size ()] ) ; > private static boolean [] parseLine ( String line ) < char [] chars = line.toCharArray () ; boolean [] result = new boolean [chars.length]; for ( int i = 0 ; i < result.length ; i++ ) < result[i] = (chars[i] == 'o'); >return result ; > >
Отслеживать
ответ дан 4 апр 2013 в 3:36
6,252 16 16 серебряных знаков 21 21 бронзовый знак
Посмотрите, что получилось у меня. Данные берутся с stdin.
Ещё бы кто-нибудь сказал, как в java описать тип массива массивов boolean, можно было бы проще написать. Это выше моего понимания этого чуда конца прошлого века. Язык, конечно, не для слабонервных. Страшноватый.
Да, возражения типа ArrayList не надо было преобразовывать в массив — не принимаются. Просто хотелось посмотреть, что же получится.
