Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中比较字符串和打印剩余字符时出现意外输出?_Java_String - Fatal编程技术网

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

在java中比较字符串和打印剩余字符时出现意外输出?,java,string,Java,String,这里我有两条线 String first = "stack overflow"; String second = "java programming"; 因此,我需要输出为: stck eflow j prgmming i、 例如,从第一个字符串中提取字符,并与第二个字符串中剩余的所有字符进行比较,如果存在,则将其删除。下面是我的代码,给出了一些意外的结果: String first = "stack overflow"; String second = "java programming

这里我有两条线

String first = "stack overflow";
String second = "java programming"; 
因此,我需要输出为:

stck eflow j prgmming
i、 例如,从第一个字符串中提取字符,并与第二个字符串中剩余的所有字符进行比较,如果存在,则将其删除。下面是我的代码,给出了一些意外的结果:

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);
String first=“堆栈溢出”;
String second=“java编程”;
对于(int i=0;i
您可以将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());
String first=“堆栈溢出”;
String second=“java编程”;
StringBuffer firstBuffer=新的StringBuffer(第一个);
StringBuffer secondBuffer=新的StringBuffer(秒);
对于(int i=0;i
我会先看每个单词中的字母,然后再打印语句。既然你说要求是打印它,而不是返回一个值,那就是我要做的。如果这是不正确的,您可以构建字符串的方式与我打印并返回字符串的方式相同。鉴于我们的评论讨论,我将尝试让这更多地成为一个教程,而不是一个答案

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

//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));
}
//提前收到信件可以让我们改进
//该算法的效率是从O(n^2)解中得到O(n)
专用集合getLetters(字符串字){
HashSet字母=新的HashSet();
for(char c:word.toCharArray()){
//您的输出打印空格,因此我将跳过它们
如果(c!='')
添加(c);
}
回信;
}
//将重复代码分解成方法有利于代码重用
//此方法将打印不在提供的集合中的任何字符
私有void打印不匹配字符(字符串字、集合字母){
for(char c:word.toCharArray()){
//因为这实际上是一个HashSet,所以它在O(1)处速度很快
如果(!字母包含(c))
系统输出打印(c);
}
}
公共void打印结果(字符串第一,字符串第二){
printUnmatchedCharacters(第一个,getLetters(第二个));
//你的字里行间有空格
系统输出打印(“”);
printUnmatchedCharacters(第二个,getLetters(第一个));
}

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

请您回答。此外,您似乎感到困惑——Java字符串是不可变的对象。也许您需要一个
StringBuilder
。请完整描述您的要求。这是我在过去一个小时左右看到的第三个此类问题。。。也有类似的字符串。巧合或者我遗漏了什么?我怀疑这不是预期的行为,他正在修改字符串并移动所有字符,但仍然增加了I,因此跳过了字符。我想如果你使用调试器并找出代码在哪里停止工作,你会发现这更有教育意义…如果你是新手的话在编程中,您必须学习的一件事就是如何使用调试器。对于程序员来说,这是一项非常有用和重要的技能,可以让您解决这种情况和遇到的许多其他问题。Throws
java.lang.StringIndexOutOfBoundsException
(我很确定它需要做很多更改才能工作)-请不要发布未经测试的代码。@Elvermg,显示错误索引越界异常他试图说明的一点是,在Java中不能对字符串进行这样的操作。它们是不变的。将要修改的字符串的副本存储在字符串缓冲区(或字符串生成器)中,修改该缓冲区或生成器,并在循环迭代后输出。尽管如此,您仍然会遇到这样的情况,即您现在正在更改循环的参数,因此可能希望根据您的第一次迭代一起跳入不同的循环。