2016-07-23 112 views
-4

当我给出的输入为mama下面的代码打印mamaa,但我只想输出为ma。有什么问题是代码如何使用java删除字符串中的重复字符?

import java.util.*; 

class Duplicate1 { 

    public static void main(String args[]) { 
     String str; 
     Scanner s=new Scanner(System.in); 
     System.out.println("enter the string"); 

     str=s.nextLine(); 
     String result=""; 
     char c=str.charAt(0); 
     result=result+c; 

     for(int i=1; i<str.length(); i++) { 
      char d = str.charAt(i); 
      for(int j=0; j<i+1; j++) { 
       if(d != result.charAt(j)) { 
        result=result+d; 
       } 
      } 
     } 
     System.out.println(result); 
    } 
} 
+0

当我给“妈妈”输入它打印“mamaa”..但我想输出为“马”。代码有什么问题..帮助我! –

+2

欢迎来到SO。请阅读这篇关于如何提出一个好问题的文章,然后相应地进行格式化。这样你将有更多的机会获得有用的答案。 http://stackoverflow.com/help/how-to-ask – lmazgon

+2

请注意:不要在评论中放置更多信息,而是更新您的问题。而且请:你希望我们帮忙,你至少需要3分钟**才能正确**格式化你的问题! – GhostCat

回答

0

我可以看到一些错误。但是,由于这显然是一项家庭作业或其他学习练习,因此您需要学习找出自己的错误。所以这里是一个提示。

提示:您只是测试与第一个字符重复的字符。 (再次阅读你的代码。)

最后,这里有上调试自己的代码的一些想法:

  1. 读你写的代码,并试图在同一时间精神上执行它,一个声明。你写的实际上是的陈述会做你需要他们做的事吗?

  2. 学习使用调试器,以及如何单步执行,设置断点并查看局部变量的值。

+0

兄弟我已经将值0更改为我在for循环..仍然是我提到的相同的错误 –

+0

1)我不是你的“兄弟”。 2)我说“我可以看到**一些**错误”。 3)你是否已经完成了我在其余答案中提出的建议? –

1

请让自己某种笔&纸测试看起来应该事端这样的:

init result = "m"; 

| i | j | d | c | comparison | result | 
|---|---|---|---|------------|--------| 
| 1 | 0 | a | m | a != m  | ma  | 
| 1 | 1 | a | a | a != a  | ma  | 
| 2 | 0 | m | m | m != m  | ma  | 
| 2 | 1 | m | a | m != a  | mam | 
| 2 | 2 | m | m | m != m  | mam | 
| 3 | 0 | a | m | a != m  | mama | 
| 3 | 1 | a | a | a != a  | mama | 
| 3 | 2 | a | m | a != m  | mamaa | 
| 3 | 3 | a | a | a != a  | mamaa | 

和/或使用调试器,它是在的allmost任何Java编辑器(NetBeans的标准,的IntelliJ, Eclipse,...),并通过你的应用程序来了解为什么出现问题。

你基本上做的是添加当前处理的字符,如果它不匹配结果字符串中的字符。对于当前结果字符串中包含的每个不匹配字符,将在结果字符串的末尾添加一个新字符0​​。

相反,如果字符在结果字符串中尚不可用,应该只添加该字符。这可以通过在外部循环中保留布尔标志found(用false初始化)来完成,该布尔标志指示是否找到匹配,并且在内部循环中,如果找到匹配,则仅将该标志设置为真,并继续迭代内部循环循环和内循环完成后,检查found标志,并只添加当前存储在d中的字符(如果发现等于false)。

更直接的解决方案是检查当前结果字符串是否只是contains某个字符,如果不是,则只添加字符。这会使内部循环完全冗余。

相关问题