【问题标题】:Comparing multiple strings character by character java逐字符比较多个字符串java
【发布时间】:2014-03-19 16:23:58
【问题描述】:

我想逐个字符地比较多个字符串,并希望输出一个字符串,其中包含大多数字符串中存在的字符。 例如我使用了三个字符串: 输入:S1=哪里,S2=这里,S3=哪里 输出:S=哪里。

我可以使用代码为 3 个字符串做到这一点:

public class stringc {

    static String S1="where";
    static String S2="wHere";
    static String S3="whera";
    static StringBuilder S=new StringBuilder();

    public static void main(String[] args)
    {
        for (int i=0;i<5;i++)
        {

            if(S1.charAt(i)==S2.charAt(i)||S1.charAt(i)==S3.charAt(i))
            {
                S.append(S1.charAt(i));
            }
        }
    }
}

谁能帮我用它来处理超过 10 个字符串。

【问题讨论】:

  • 您说“存在于大多数字符串中”实际上应该读作“存在于所有字符串中”吗?
  • 这里是否可以选择使用 Guava 或 Java 8?因为使用 MultiSet 或 lambdas 的组合很容易实现这一点。你需要做的是对一袋字符进行多数表决,这类似于this question 对整数的多数表决。

标签: java string compare stringbuilder


【解决方案1】:

使用数组/字符串列表,而不是 int i=0;i&lt;5;i++ 使用 int i=0;i&lt;array.length;i++ // 使用 list.size() 作为列表

【讨论】:

    【解决方案2】:

    这是我敲的一个。它比较输入字符串中的字符,以检查它们在相同位置的每个字符串中是否相同。 如果该位置的字符在所有输入字符串中都匹配,则相同的字符将出现在该位置的结果字符串中。

    public class MultipleStringComparator {
    
    public static void main(String[] args) {
    
        String[] input = new String[] {"abcdeFgh","abcdefgh","abcdefgh","abcdefgh","abcdefgh"};
    
        MultipleStringComparator comp = new MultipleStringComparator();
        System.out.println(comp.compare(input, '.'));
    }
    
    /**
     * Compare strings character by character
     * @param strings
     * @param substitute - character to insert in result where strings do not match
     * @return result
     */
    public String compare(String[] strings, char substitute) {
    
        //How long is the longest string?
        int longest = 0;
        for (String string : strings) {
            if (string.length()>longest) longest = string.length();
        }
    
        //Initialise result
        StringBuffer result = new StringBuffer();
    
        //compare strings character by character
        //If the corresponding characters in all input strings match, append to result
        for (int position=0; position<longest; position++) {
            char character = allCharactersMatch(strings, position);
            if (character!=0) {
                result.append(character);
            } else {
                result.append(substitute);
            }
        }
    
        return result.toString();
    }
    
    /**
     * Compares the character at the specified position in all input strings
     * @param strings
     * @param position
     * @return character found is same in all strings, otherwise 0;
     */
    private char allCharactersMatch(String[] strings, int position) {
        char found = 0;
        for (String string : strings) {
            if (string.length()<=position) return 0;
            if (string.charAt(position)!=found && found!=0) return 0;
            found = string.charAt(position);
        }
        return found;
    }
    
    }
    

    【讨论】:

    • 请注意,我的一个测试字符串有一个大写 F,其他小写。
    【解决方案3】:

    我会怎么做:

    1. 对于您的每个字符串,请致电toCharArray()
    2. 将生成的 char[] 添加到 2D char 数组中
    3. 对于 2D 数组中的每个单词,将您正在检查的字符添加到映射中,如果字符已经在映射 keySet() 中,则递增计数器
    4. 地图中出现次数最多的字符(最高计数器)是要添加到结果字符串中的字符。
    5. 对字符串中的所有字符重复步骤 3 和 5
    6. 输出你构建的字符串

    这是一段代码,使用您的示例和更多字符串:

    public static void main(final String[] args) {
        final  StringBuilder stringBuilder = new StringBuilder();
    
        //Points 1 and 2
        final char[][] characters = new char[][]{
                "where".toCharArray(),
                "wHere".toCharArray(),
                "where".toCharArray(),
                "wperg".toCharArray(),
                "where".toCharArray(),
                "w6ere".toCharArray(),
                "where".toCharArray(),
                "where".toCharArray(),
                "wHere".toCharArray(),
                "w4eeg".toCharArray(),
                "where".toCharArray(),
                "wHare".toCharArray(),
                "where".toCharArray(),
                "where".toCharArray(),
                "weede".toCharArray(),
                "whare".toCharArray(),
                "wHect".toCharArray(),
                "where".toCharArray(),
                "wHere".toCharArray(),
                "whara".toCharArray()
        };
    
        //Point 3
        for (int i=0; i < 5 ; i++) {
    
            //Point 4
            final Map<String, Integer> occurrences = new HashMap<String, Integer>();
            for(int j = 0; j < characters.length; j++ ) {
    
                final String character = ""+characters[j][i];
    
                if( occurrences.containsKey(character) ) {
                    Integer currentTotal = occurrences.get(character);
                    occurrences.put(character, ++currentTotal);
                    continue;
                }
    
                occurrences.put(character, 1);
            }
    
            //Point 5
            int mostOccurrences = 0;
            String characterWithMostOccurrences = "";
            for (final String character : occurrences.keySet()) {
                if( occurrences.get(character) > mostOccurrences ) {
                    mostOccurrences = occurrences.get(character);
                    characterWithMostOccurrences = character;
                }
            }
    
            stringBuilder.append(characterWithMostOccurrences);
    
        }
    
        //Point 6
        System.out.println(stringBuilder.toString());
    }
    

    【讨论】:

    • string to CharArray 可以简化吗?就像使用 for 循环将字符串转换为 chararray 一样。由于字符串不多,手工工作会很困难
    • 是的,您可以循环执行,但您需要一些数据结构来保存单词列表。如果结构是列表或集合,您可以循环遍历集合,然后一次将 char 数组添加到数组中。如果单词在文件中,您可以读取文件并将单词拆分(取决于分隔符),然后将它们添加到数组中。我这样做是一个简单的例子。
    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2019-01-14
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多