Есть ли способ проверить, содержат ли две строки одни и те же символы. Например,Проверьте, содержат ли 2 строки одинаковые символы?
abc, bca -> true
aaa, aaa -> true
aab, bba -> false
abc, def -> false
Есть ли способ проверить, содержат ли две строки одни и те же символы. Например,Проверьте, содержат ли 2 строки одинаковые символы?
abc, bca -> true
aaa, aaa -> true
aab, bba -> false
abc, def -> false
Включите каждую строку в char [], сортируйте этот массив, затем сравните два. Просто.
private boolean sameChars(String firstStr, String secondStr) {
char[] first = firstStr.toCharArray();
char[] second = secondStr.toCharArray();
Arrays.sort(first);
Arrays.sort(second);
return Arrays.equals(first, second);
}
Вы можете преобразовать строку в массив символов, сортировка массивов и их сравнивать массивы:
String str1 = "abc";
String str2 = "acb";
char[] chars1 = str1.toCharArray();
char[] chars2 = str2.toCharArray();
Arrays.sort(chars1);
Arrays.sort(chars2);
if(Arrays.equals(chars1,chars2)) {
System.out.println(str1 + " and " + str2 + " are anagrams");
} else {
System.out.println(str1 + " and " + str2 + " are not anagrams");
}
здесь:
String str1 = "abc";
String str2 = "cba";
/* create sorted strings */
/* old buggy code
String sorted_str1 = new String(java.utils.Arrays.sort(str1.toCharArray()));
String sorted_str2 = new String(java.utils.Arrays.sort(str2.toCharArray()));
*/
/* the new one */
char [] arr1 = str1.toCharArray();
char [] arr2 = str2.toCharArray();
java.utils.Arrays.sort(arr1);
java.utils.Arrays.sort(arr2);
String sorted_str1 = new String(arr1);
String sorted_str2 = new String(arr2);
if (sorted_str1.equals(sorted_str2)) {
/* true */
} else {
/* false */
}
Arrays.sort (..) имеет тип возврата void, поэтому вы не можете использовать его непосредственно в конструкторе String. – GaryF
Вы правы. я скорректировал код и опубликовал его снова. –
очень легко - но не очень эффективно - способ сделать это, конвертировать ваши String
s в массивы char и использовать java.util.Arrays.sort на них, получить String
s назад и сравнить для равенства. Если ваши строки находятся под несколькими тысячами символов, это должно быть очень хорошо.
Если у вас несколько строк в мегабайтах, вы можете создать массив со счетом для каждого символа (используя его код как индекс), иметь один проход по одной строке, добавляющий один из числа каждого символа, а один передать вторую строку, удалив ее. Если вы попадаете под 0 в любой момент во время второго прохода, у них нет одинаковых символов. Когда вы закончите со второй строкой без ошибок, вы уверены, что они имеют одинаковые символы, если они имеют одинаковую длину (которую вы должны были проверить в любом случае).
Этот второй метод намного сложнее, чем сортировка строк, и для этого требуется большой массив, если вы хотите работать с строками unicode, но это прекрасно, если вы в порядке с 128 символами набора ascii и много Быстрее.
Не беспокойтесь, если у вас нет нескольких миллионов символов в ваших строках. Сортировка строк намного проще и не значительно медленнее в строках с несколькими десятками символов.
+1 для указания плюсов и минусов различных решений – sleske
В (мелочам ;-)) примечание стороны:
Имейте в виду, что решения, предлагаемые здесь работают только для строк, состоящих из символов из Basic Multilingual Plane (BMP) в Unicode.
символы вне BMP представлены в виде пары из char
в String
, так что вам нужно обратить особое внимание, так что вы держите пары вместе. См. Javadocs от java.lang.Character
для деталей gory.
К счастью, большинство персонажей вне BMP довольно экзотичны. Даже большинство японцев и китайцев находится в BMP ...
На самом деле решения здесь будут работать вне BMP просто отлично. Проблема в том, что они не будут работать с ненормированными строками; проблема заключается в том, что «é» может быть написано либо как отдельный символ, либо композиция «e» и акцент. (Это проблема для ряда европейских языков и немногих других). –
@ Дональные стипендиаты: как они могут работать вне BMP? Символ извне BMP будет представлен как пара суррогатов, т. Е. Как два 'char'. Если вы затем вызываете, например, 'Arrays.sort (chars1)', функция сортировки, которая не знает о суррогатах, будет радостно разрывать суррогаты и создавать мусорные данные. Или я чего-то не хватает? – sleske
@ Donal Fellows: Но, конечно, вы правы, что проблема также будет возникать при объединении символов. И BTW, используя нормированную строку, недостаточно, потому что существует несколько разных нормализаций, а некоторые используют комбинирование символов. – sleske
Рассмотрите возможность создания подписи для данной строки. Использование счетчика и символа.
a-count:b-count:c-count:.....:z-count:
(удлините для верхнего регистратора, если хотите).
Затем сравните подпись. Это должно улучшиться для очень больших строк.
В качестве ярлыка, проверьте длину. Если они не совпадают, все равно верните false.
Возможно, это не самый быстрый ответ, но должен иметь самый короткий ответ.
boolean hasSameChar(String str1, String str2){
for(char c : str1.toCharArray()){
if(str2.indexOf(c) < 0) return false;
}
for(char c : str2.toCharArray()){
if(str1.indexOf(c) < 0) return false;
}
return true;
}
Здесь:
import java.util.Arrays;
общественного класса CompareString {
String str = "Result";
String str1 = "Struel";
public void compare() {
char[] firstString = str.toLowerCase().toCharArray();
char[] secondString = str1.toLowerCase().toCharArray();
Arrays.sort(firstString);
Arrays.sort(secondString);
if (Arrays.equals(firstString, secondString) == true) {
System.out.println("Both the string contain same charecter");
} else {
System.out.println("Both the string contains different charecter");
}
}
public static void main(String[] args) {
CompareString compareString = new CompareString();
compareString.compare();
}
}
возможно дубликат [Проверяется две строки перестановками друг друга] (HTTP: // stackoverflow.com/questions/2131997/checking-if-two-strings-are-permutations-of-each-other) – finnw