有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中比较字符串和打印剩余字符时出现意外输出?

这里有两条线

String first = "stack overflow";
String second = "java programming"; 

因此,我需要输出为:

stck eflow j prgmming

即,从第一个字符串中提取字符,并与第二个字符串中剩余的所有字符进行比较,如果存在,则将其删除。下面是我的代码,给出了一些意想不到的结果:

String first = "stack overflow";
String second = "java programming";
for (int i = 0; i < first.length(); i++) {
    out.println("char position :" + first.charAt(i));
    for (int j = 0; j < second.length(); j++) {                    
        if (first.charAt(i) == second.charAt(j)) {
            first = first.substring(0, i) + first.substring(i + 1);
            second = second.substring(0, j) + second.substring(j + 1);
        }
    }
}
out.println(first+second);

共 (2) 个答案

  1. # 1 楼答案

    可以将StringBuffer与字符串一起使用。从StringBuffer对象而不是String对象中删除必要的字符

        String first = "stack overflow";
        String second = "java programming";
        StringBuffer firstBuffer = new StringBuffer(first);
        StringBuffer secondBuffer = new StringBuffer(second);
        for (int i = 0; i < first.length(); i++) {
            out.println("char position :" + first.charAt(i));
            for (int j = 0; j < second.length(); j++) {                    
                if (first.charAt(i) == second.charAt(j)) {
                    firstBuffer.deleteCharAt(i);
                    secondBuffer.deleteCharAt(j);
                }
            }
        }
        System.out.println(firstBuffer.toString()+secondBuffer.toString());
    
  2. # 2 楼答案

    我会先看每个单词中的字母,然后再打印声明。既然你说的要求是打印它,而不是返回一个值,那就是我要做的。如果这是不正确的,你可以构建字符串,就像我打印并返回字符串一样。鉴于我们的评论讨论,我将尝试让这更像是一个教程,而不是一个答案

    该准则做出以下假设: 两个字符串之间只有空格是有效字符。 两个词都在同一个格里

    //Getting the letters up front could allow us to improve 
    //the efficiency of this algorithm to O(n) from your O(n^2) solution
    private Set<Character> getLetters(String word) {
       HashSet<Character> letters= new HashSet<Character>();
       for (char c: word.toCharArray()) {
          //your output prints spaces so I'll skip them
          if (c != ' ')
             letters.add(c);
       }
       return letters;
    }
    
    //Breaking out duplicate code into methods is good for code reuse
    //This method will print any character not in the Set provided
    private void printUnmatchedCharacters(String word, Set<Character> letters) {
       for (char c: word.toCharArray()) {
           //Since this is actually a HashSet contains is fast at O(1)
           if(!letters.contains(c))
              System.out.print(c);
       }
    }
    
    public void printResults(String first, String second) {
       printUnmatchedCharacters(first, getLetters(second));
       //You have a space between your words
       System.out.print(' ');
       printUnmatchedCharacters(second, getLetters(first));
    }
    

    虽然上面的代码更长,但效率更高,可以分解成更小的代码块。如果出现问题,调试会更容易一些,您可以更容易地进行单元测试。因为你是编程新手,我希望这个答案能帮助你学到一些其他的东西,除了你想要的问题