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

时间:2014-05-22 01:38:20

标签: java string

这里我有2个字符串

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 个答案:

答案 0 :(得分:0)

我会首先查看每个单词中的字母,然后从那里打印出来。因为你说要求是打印它而不是返回我将要做的值。如果这不正确,您可以按照我打印它并返回它的方式构建字符串。在我们的评论讨论中,我将尝试将其作为一个教程,而不是一个答案。

该代码做出以下假设: 只有空格是两个字符串之间的有效字符。 这两个词都是相同的。

//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));
}

虽然上面的代码更长,但它更有效并分解为更小的块。如果出现问题则可以更轻松地进行调试,并且可以更轻松地对其进行单元测试。由于你是编程新手,我希望这个答案可以帮助教你除了你正在寻找的问题之外的其他一些东西。

答案 1 :(得分:-1)

您可以将StringBuffer与String一起使用。从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());