【问题标题】:Question >> print "True" or "False" if the string contains two or more characters问题 >> 如果字符串包含两个或多个字符,则打印“True”或“False”
【发布时间】:2019-03-24 01:35:26
【问题描述】:

我必须创建一个名为 'contains' 的方法,它接受一个字符串和一个字符作为参数,如果该字符在字符串中出现两次或更多次,则返回 true。

示例:输入 contains("Apple", 'p') 应返回“True”

private boolean contains(String a,char b) { 

    if(a.contains(b)) {
        print("true");
    }
    else {
        print("");
    }
    //boolean c = a.contains('l');
    return false;
    }

我知道这段代码是错误的......我想知道我必须做什么以及我必须修复什么。 我会很感激你的建议 谢谢。

【问题讨论】:

  • a.chars().filter(c -> c == b).count() >= 2
  • 最好的方法是迭代和计数。查看@Scary Wombat 的回答
  • 只要短语“...或更多次...”是问题陈述的一部分,循环应该立即出现在您的可能解决方案列表中。跨度>

标签: java string


【解决方案1】:

countMatches(a,b) 返回String a 中 b 的计数。它来自org.apache.commons.lang3

private boolean contains(String a,char b) { 
    return StringUtils.countMatches(a, b)>=2 ;
}

或者在简单的java中你可以使用

private boolean contains(String a,char b) { 
    return (a.length() - a.replaceAll(String.valueOf(b),"").length())>=2 ;
}

【讨论】:

  • replace 会更好
  • 是的。但它完全可以正常工作。我不知道为什么人们把-2。至少他们必须告诉我为什么他们把-1。没有错误。
  • 我想是的,他们为什么放 - .. 我检查了你的代码在 eclipse 上的工作,但我很难理解 .. ^^; ;因为我是 Java 新手。无论如何,谢谢您的评论:D
【解决方案2】:

有几种方法可以做到这一点,但最简单的方法是遍历字符串以查找字符,如果计数达到 2,则返回 true。

为此考虑使用

for (char c : input) {

  if (c == myChar) count++;
  if (count >= 2) return true;
}
return false;

另一种方法是使用 String.replace 并将想要的字符替换为 "" 然后比较String前后的大小

【讨论】:

  • 我认为我们应该使用 if (count == 2) return true; 因为如果我们在 count==2 时返回,count > 2 将不会执行
  • 我会说> 1 是最好的 ;)
  • 我不是说你错了,但如果你返回 count==2 那么我们需要>=吗?
  • @suvojit_007 这是我 30 年前被教导的一种安全机制,与这种情况无关,但 >= 2 捕获 2 或 3 或 4 等,而 == 2 仅捕获 2
  • @ColdIV 我不同意2 是规范的一部分。未来几年,当 OP 搜索他的代码以查找在 2 返回的位置时,他会发现它更容易。当然,他应该使用某种 CONSTANT,但那是另一回事了。
【解决方案3】:

您的方法可能会根据原始字符串和没有给定字符的字符串之间的大小差异返回一个布尔值:

return (a.length() - (a.replace(b, '')).length()) >= 2 ;

【讨论】:

    【解决方案4】:

    理论上:

    首先:您需要使用 for 循环遍历输入字符串字符,然后在每次迭代中将字符串中的当前字符与作为方法参数给出的另一个字符参数进行比较。如果它们匹配,那么您可以增加一个计数器(一个变量)。然后比较计数器值是否为 2 并立即返回 true。在方法结束时,您可以像之前一样返回 false。

    第二:您正在打印 true ,而不是返回 true 。当变量的值变为2时应该使用return true;

    【讨论】:

      【解决方案5】:
        public class Demo {
      
          public static boolean contains(String str,char c){
              //todo:check str for NullPointExecption
              int flag=0;
              for(int i=0;i<str.length();i++){
                  if(c==str.charAt(i)){
                      flag++; //if str contains char c,flag=flag+1
                  }
                  if(flag>=2){
                      return true; //if flag>=2,return true
                  }
              }
      
              return false;
          }
      
          public static void main(String[] args) {
              System.out.println(contains("appple", 'p'));//result is true
          }
      }
      

      【讨论】:

      • 所以@K.Fred 你选择了这个答案,因为它为你做了所有的工作,没有提供任何解释,并且使用了与 13 分钟后我的答案完全相同的逻辑。
      • 我要求那些反对这个答案的人解释他们的推理,因为 OP 是一个新的贡献者。 @OP我的猜测是因为这是一个纯代码的答案。你应该解释你为什么做你所做的以及它是如何工作的;特别是因为提问者表示他们是 Java 新手。
      • @Scary Wombat 不被我选中你生气吗?这就是我学习的方式:(而且我知道你和 Humy 的代码具有相同的逻辑,我只是​​在检查你的代码是什么意思。在那一刻,Humy 给出了完整的解决方案并附有评论,这就是我选择他的原因。跨度>
      • @Scary Wombat 我知道你认为我是一名学生,只是在寻求答案。但我不是。
      • @Slaw 对不起我的错误,我今天和我的游泳池 Englist 一起加入了 stackoverflow,我在翻译的帮助下编辑了这个答案和评论,如你所见,我有很多语法错误。而且我认为我的回答很容易理解。没有使用复杂的 API 和语法。问题:OP 是指谁回答了这个问题?
      【解决方案6】:

      这是执行此操作的一种简单方法。这里将字符串放入 char 数组中。这样更容易检查 char 数组的元素并找出相同的字符。

      private boolean contains(String a, char b) {
      
          char[] c_array = a.toCharArray();
          int count = 0;
          for (int i = 0; i < c_array.length; i++) {
              if (b == c_array[i]) {
                  count++;
                  continue;
              } else {
                  continue;
              }
          }
          if (count >= 2) {
              return true;
          } else {
              return false;
          }
      }
      

      【讨论】:

      • 几个小问题。 (1) continues 是不必要的(我认为会损害可读性)。 (2) 无论如何,你循环整个String,但方法的契约只要求角色出现两次。换句话说,您应该在count == 2 时立即跳出循环。 (3) 我更喜欢使用return count &gt;= 2 而不是 if-else 解决方案。
      • 是的,这是真的。谢谢你。
      猜你喜欢
      • 2014-03-30
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多