简体   繁体   English

比较两个字符串中的字符

[英]Comparing character in two Strings

I want to check if the characters in each String are the same, and can I build a second String which is given from the characters from first String.我想检查每个字符串中的字符是否相同,是否可以构建第二个字符串,该字符串是从第一个字符串中的字符给出的。 For example I have Random String ="amksomsamk" and i have to compare it to another "askommmaks".例如,我有随机字符串 =“amksomsamk”,我必须将它与另一个“askommaks”进行比较。

Firstly I write metod which check length首先我写了检查长度的方法

     public boolean areEquals(String s1, String s2){
        if (s1.toCharArray().length == s2.toCharArray().length){
            return true;
        }else
            return false;

and now I want to check each character in posible easy way.现在我想以可能的简单方式检查每个字符。 I will be grateful for your help我会很感激你的帮助

PS.附注。 For given example I want to get true in return because characters in this particular Strings are the same.对于给定的示例,我希望返回 true,因为此特定字符串中的字符是相同的。 amksomsamk a:2 m:3 k:2 s:2 o:1 askommmaks a:2 m:3 k:2 s:2 o:1 If i use equals it won't be working amksomsamk a:2 m:3 k:2 s:2 o:1 askommmaks a:2 m:3 k:2 s:2 o:1 如果我使用 equals 它将无法工作

Convert each String to char[]将每个String转换为char[]

char[] str1 = s1.toCharArray();
char[] str2 = s2.toCharArray();

Sort each char[]对每个char[]排序char[]

Arrays.sort(str1);
Arrays.sort(str2);

Check if equal检查是否相等

return Arrays.equals(str1, str2);

You can compare it just using below function:您可以使用以下函数进行比较:

public boolean isEqual(String s1, String s2) {
    if (s1.length() != s2.length())
        return false;

    Map<Character, Integer> charsCountMap = getCharsByCount(s1);


    for (char c : s2.toCharArray()) {
        if (charsCountMap.get(c) == null)
            return false;

        charsCountMap.put(c, charsCountMap.get(c) - 1);
    }

    return charsCountMap.values().stream()
            .allMatch(count -> count == 0);
}

private Map<Character, Integer> getCharsByCount(String s) {
    Map<Character, Integer> charsCountMap = new HashMap<>(s.length());

    for (char c : s.toCharArray())
        charsCountMap.put(c, charsCountMap.getOrDefault(c, 0) + 1);

    return charsCountMap;
}

Using recursion with StringBuilder strings gives a terse solution, though it's not easy to understand the code:对 StringBuilder 字符串使用递归提供了一个简洁的解决方案,尽管代码不容易理解:

public static void main(String[] args) {
    String s1 = "☆★👌\u4e16\u754c\u4f60d👉bbbZZ❸💋";
    String s2 = "Zb☆b\u754cb★👌👉\u4e16d❸\u4f60Z💋";
    boolean matched = (s1.length() != s2.length()) ? false : compareStrings(new StringBuilder(s1), new StringBuilder(s2));
    System.out.println("Same chars for '" + s1 + "' and '" + s2 + "'? " + matched);
}

private static boolean compareStrings(StringBuilder sb1, StringBuilder sb2) {
    if (sb1.length() == 0) {
        return true;
    }
    int ind = sb2.indexOf((String) sb1.subSequence(0, 1));
    return ind == -1 ? false : compareStrings(sb1.deleteCharAt(0), sb2.deleteCharAt(ind));
}

This is the output:这是输出:

Same chars for '☆★👌世界你d👉bbbZZ❸💋' and 'Zb☆b界b★👌👉世d❸你Z💋'? '☆★👌世界你d👉bbbZZ❸💋'和'Zb☆b界b★👌👉世d❸你Z💋'的字符相同吗? true真的

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM