【问题标题】:Boolean algorithm producing true output when output should be false当输出应该为假时,布尔算法产生真输出
【发布时间】:2015-11-30 16:05:31
【问题描述】:

基本上,我正在尝试创建一个算法来测试给定的字符串是否是字符串列表的覆盖字符串。如果一个字符串包含列表中每个字符串的字符,并且保持列出字符串的从左到右的顺序,那么它就是一个覆盖字符串。例如,对于“cat”和“dog”这两个字符串,“cadhpotg”将是一个覆盖字符串,但“ctadhpog”不会是一个。

我创建了一个算法,但是当输出应该为假时,它会产生输出为真,因为给定的字符串是字符串 list1 和 list2 的覆盖字符串,但不是 list3。

任何关于为什么该算法产生错误输出的帮助将不胜感激。

public class StringProcessing2 {

//ArrayList created and 3 fields added.
public static ArrayList<String> stringList = new ArrayList<>();
public static String list1 = "phillip";
public static String list2 = "micky";  
public static String list3 = "fad"; 

//Algorithm to check whether given String is a cover string.
public static boolean isCover(String coverString){
    int matchedWords = 0;
    stringList.add(list1);
    stringList.add(list2);
    stringList.add(list3);

    //for-loops to iterate through each character of every word in stringList to test whether they appear in
    //coverString in left to right order.
    for(int i = 0; i < stringList.size(); i++){
    int countLetters = 1;
        for(int n = 0; n < (stringList.get(i).length())-1; n++){
            if(coverString.indexOf(stringList.get(i).charAt(n)) <= (coverString.indexOf((stringList.get(i).charAt(n+1)), 
                    coverString.indexOf((stringList.get(i).charAt(n)))))){
                countLetters++;
                if(countLetters == stringList.get(i).length()){
                matchedWords++;                     
                }                                  
            }               
        }
    }
if(matchedWords == stringList.size()){
    return true;
}
else
    return false;   
}

public static void main(String[] args) {
System.out.println(isCover("phillmickyp"));

}


}

【问题讨论】:

  • 您应该使用 IDE 调试它。它会帮助你学习。我还会从一个更简单的示例开始,以了解问题所在。
  • 可能想test drive这个。这里有很多回归错误的范围。
  • 想想phillip这个例子。这包含紧接在l 之前的i 紧接在i 之前的l。想想为什么这会让事情变得更加棘手。
  • 如果你的代码缩进正确,它会更清楚地表明它没有任何意义。它甚至无法编译。
  • @BobTheBuilder 谢谢你的建议。我对编码很陌生,当我尝试通过在 netbeans 上的调试选项卡下选择“调试项目”来调试我的项目时,它只是输出 true 而没有错误,我是否正确调试我的项目以测试错误?

标签: java string algorithm if-statement for-loop


【解决方案1】:

解决此问题的最简单方法可能是将问题分解为多个部分。让每个功能做尽可能少的工作,同时仍然朝着总体目标完成一些事情。

为此,我建议创建一个辅助方法,它接受两个字符串并返回一个布尔值,检查一个字符串是否是另一个字符串的封面。

boolean isCover(String s, String cover)
{
  int i = 0;
  for(char c : s.toCharArray())
    if((i = cover.indexOf(c, i)) == -1)
      return false;
  return true;
}

然后,一旦你有一些东西可以正确地告诉你它是否是一个有效的覆盖字符串,检查一个字符串是否是多个字符串的有效覆盖就变得更加简单

boolean isCover(List<String> strings, String cover)
{
  for(String s : strings)
    if(!isCover(s, cover))
      return false;
  return true;
}

【讨论】:

  • 非常感谢您的回复,我以前从未见过创建高级 for 循环的方法或考虑将字符串转换为 char 数组的概念,这些都是非常有用的提示。
  • 我以前从未见过高级 for 循环,请您解释一下第一个布尔值背后的逻辑,以及它如何确保在封面中保持字符的从左到右的顺序?这会很有帮助。
  • @Mickd94 for-each loop 迭代集合,在本例中是一个数组。 for-each 循环从 0 开始逐一显示数组中的每个值,在本例中为 String 中的每个字符。 int 是保存找到的字母的最后一个位置,因为每个新字母都必须超出最后一个,否则封面字符串会乱序。
猜你喜欢
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2014-12-10
  • 1970-01-01
  • 2020-01-30
  • 2017-05-09
  • 2019-08-30
相关资源
最近更新 更多