在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,因此跳过了字符。我想如果你使用调试器并找出代码在哪里停止工作,你会发现这更有教育意义…如果你是新手的话在编程中,您必须学习的一件事就是如何使用调试器。对于程序员来说,这是一项非常有用和重要的技能,可以让您解决这种情况和遇到的许多其他问题。Throwsjava.lang.StringIndexOutOfBoundsException
(我很确定它需要做很多更改才能工作)-请不要发布未经测试的代码。@Elvermg,显示错误索引越界异常他试图说明的一点是,在Java中不能对字符串进行这样的操作。它们是不变的。将要修改的字符串的副本存储在字符串缓冲区(或字符串生成器)中,修改该缓冲区或生成器,并在循环迭代后输出。尽管如此,您仍然会遇到这样的情况,即您现在正在更改循环的参数,因此可能希望根据您的第一次迭代一起跳入不同的循环。