2016-11-04 67 views
0

我有这个程序,我为我的CS课程在高中写作。起初,我没有发现任何问题,并且很高兴能够把它缩小到不错的尺寸(不像我旁边的小孩)。最近我意识到代码应该存在问题。让我给你提供背景信息。为什么在无效子串检查之前退出循环?

该类设想运行一个字符串并删除所有重复的相邻字符,以便只保留其中一个。所以eeee变成了e,而eeels变成了els。

我的方法是运行通过每个索引(除了最后一个),如果它发现重复,删除当前索引。要解决3个以上相邻字符的问题,我将for循环中的变量每次重置为-1,以便它将从索引0开始并查找另一对。

我觉得它应该有的问题是,如果字符串是简单的重复相同的字符,当它缩小到只有一个字符时,它应该仍然试图检查下一个和下一个字符,这会引发错误。

因为这很可能没有意义,所以我在代码中放了一些打印语句来说明我的观点。请注意,字符串保存在str实例变量中,但问题要求它保持不变,所以我做了一个副本。

这是我在该方法中使用的代码:

public String removeDups(){ 
    String copy = str; 
    for(int x = 0; x < copy.length()-1; x++){ 
     System.out.println("Checking -> " + copy); 
     if(copy.substring(x, x+1).equals(copy.substring(x+1, x+2))){ 
      copy = copy.substring(0, x) + copy.substring(x+1); 
      //Restarts the search to make sure three characters in a row are adressed correctly 
      x = -1; 
     } 
     System.out.println("New Copy -> " + copy); 
     System.out.println(x + " < " + copy.length() + " == " + (x < copy.length()-1)); 
    } 
    return copy; 
} 

,这是我的测试案例,因为我发现这个问题

ProblemX p5 = new ProblemX("eee"); 
s = p5.removeDups(); 
System.out.println(s); 
s = p5.toString(); 
System.out.println(s); 

这是打印

Checking -> eee 
New Copy -> ee 
-1 < 2 == true 
Checking -> ee 
New Copy -> e 
-1 < 1 == true //This is true, so it should loop again. 
e //This is the weird thing, loop is broken. 
eee 

在我标记注释的地方,循环应该再执行一次(条件成立),这意味着代码wo因为它不能在索引2处接收一个子字符串,但是代码在那里退出并且完全回到主方法。

虽然这显然有效,我想要一个探索。谢谢。编辑:如果问题确实出现,我知道我可以把条件(copy.length()> = 2)放在if语句中,以确保当字符串太小时没有任何反应,并且循环将会最终打破。

+0

根据我的经验,删除集合中当前索引\对象是一个坏主意。也许'节点'是处理需要的情况的一个好方法[Node](https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html) – ItamarG3

+3

Your最后一个打印使用'copy.length',但循环使用'length -1',当然,x会在打印结束时递增。所以这对我来说似乎是逻辑(快速阅读,可能会误)。基本上,你应该写'System.out.println((x + 1)+“<”+(copy.length()-1)+“==”+(x + 1 AxelH

+0

@ItamarGreen对不起,但这没有任何意义。首先,我们在这里处理字符串,而不是集合;然后不需要为这个简单的字符串处理使用一些XML-DOM类。 – JimmyB

回答

2

的原因,你的循环将不会执行一个更多的时间是由于您的for循环使用的条件:

x < copy.length()-1 

通常情况下,通过项目的列表迭代时,你可以使用:

x < copy.length() 

x <= copy.length() - 1 

然而,你的循环使用都<(而不是<=)和copy.length() - 1(而不仅仅是copy.length())。因此,当x为0且copye时,条件循环为0 < 0,其计算结果为false

重要的是要记住,x递增后循环完成,这就是为什么你的支票在循环结束返回true是很重要的,但下面的循环条件返回false。