【问题标题】:Check if letters that a word consists of are present in another string检查一个单词所包含的字母是否存在于另一个字符串中
【发布时间】:2014-04-21 07:11:38
【问题描述】:

这是我第一次在这里发帖,所以如果我需要更正这篇文章中的任何内容,请告诉我。我想就一些给我带来麻烦的事情寻求帮助。我需要检查一个字符串的字符是否出现在另一个字符串中,但它们只需要检测一次。例如,对于字符串“BFEABLDEG”,“LABEL”不应该像当前那样返回 true。

为了澄清,目的不是让程序计算字符数。它是让程序检查创建单词所需的字母是否包含在随机字符串中,两个字符串中每个字母的数量完全相同。该程序部分基于游戏节目Countdown。

这是我目前所拥有的。任何帮助将不胜感激。

编辑:感谢所有帮助我的人。我接受了 Aru 的贡献作为我正在寻找的解决方案,因为它避免了我最准确地遇到的问题,因为需要检查的字符串的大小。

public static boolean Checkword(){
String randomString = "BFEABLDEG";
 String word = "LABEL";
 {
 for(int i=0;i<word.length(); i++){
      if(randomString.contains(word.substring((i)))){
          return true;

      }
 }
return false;
 }

}

好的,我得到的解决方案适用于基本示例。然而,最终目标是让用户从九个随机字符的字符串中生成任意长度的单词。目前,他们可以通过添加比字符串中更多的任何字符来实现这一点。鉴于该函数已添加到新代码,我想知道是否有人可以帮助我。

    public static boolean Checkword(String x){
    String randomString = convertToString();
     String word = x;
     {
     for(int i=0;i<word.length(); i++){
          if(randomString.indexOf(word.charAt(i)) == -1){
              return false;

          }
     }
    return true;
     }
}

【问题讨论】:

  • 嘿,randomString 中的字母“L”是否必须出现两次,因为"LABEL" 中有两个“L”?
  • boolean...Java?您应该标记您正在使用的语言。
  • 没有。我的问题的目的是确保“标签”这个词会返回错误。目前它正在返回 true。
  • 所以它返回true 还是返回false..?
  • 我认为你需要使用这样的东西stackoverflow.com/a/1816989/2591612

标签: java string for-loop substring contains


【解决方案1】:

我不确定我是否完全理解你想要达到的目标,但你的方法的整个逻辑是有缺陷的。

显然,一个问题是,如果只有最后一个字符匹配,您的函数将返回true,因为substring(word.length() - 1) 将检查最后一个字符是否包含在另一个字符串中。在每个其他循环中,您正在检查是否包含整个序列,从整个字符串开始并减少每个循环的字符数量。

即使您将不在randomString 中的字符添加到word,只要它们不在字符串的末尾,该函数也会返回true。

这样的东西应该是你最初寻找的东西:

public static boolean checkWord() {
    String randomString = "BFEABLDEG";
    String word = "LABEL";
    for (int i = 0; i < word.length(); i++) {
        if (randomString.indexOf(word.charAt(i)) == -1) {
            return false;
        }
    }
    return true;
}

同时检查重复字符的一个简单解决方案是删除字符串中出现的一个字符。当然有更有效的解决方案,请务必检查 cmets 中链接的线程。

public static void main(String[] args) throws Exception {
    System.out.println(test("BFEABLDEG", "LABEL"));
}

public static boolean test(String searchIn, String searchFor) {
    for (char c : searchFor.toCharArray()) {
        if (searchIn.indexOf(c) == -1) {
            return false;
        }
        searchIn = searchIn.replaceFirst(Character.toString(c), "");
    }
    return true;
}

【讨论】:

  • 是的,我想就是这样。例如,如果这将返回带有“标签”的 False,但对于“捆”返回 True,那么这将按我的意愿工作。
  • 我添加了一种可能的解决方案来解决重复出现的问题。不过,这会创建很多新字符串,所以如果您使用的是大字符串,您应该考虑另一种解决方案。
  • 没问题。字符串长度不超过 9 个字符,但我会采取任何必要的步骤来满足我的需要,当然。
  • 不幸的是,将这个版本的方法添加到整个程序中,这是一个测试,会引发与以前相同的问题。我不完全确定我哪里出错了。
  • 哪个版本?首先?对于“LABEL”,第一个仍然会返回 true(因为我刚刚纠正了您尝试的一般缺陷)。然而,第二个不会。
【解决方案2】:

返回 true 是因为您测试了一个随机字符串字符

public static boolean Checkword( String pattern, String randomString ){
  return ( randomString .contains( pattern ) ) ? true : false;
}

String pattern = "LABEL";

String randomString = "BFEABLDEG";
Checkword( pattern, randomString );
//return false

randomString = "AZDAZLABELIIDZA";
Checkword( pattern, randomString );
//return true

【讨论】:

  • return ( randomString .contains( pattern ) ) ? true : false; 毫无意义。你可以写return randomString.contains(pattern)。你为什么要发明一种除了包装另一个方法之外什么都不做的新方法?
  • 是的,没有意义,只是为了举例,我可能不明白他想要达到什么目的
【解决方案3】:

如果您的word 变量中的任何字符包含在您的randomString 变量中,您的程序将返回true。从您的 cmets 来看,您似乎想检查 word 字符串中的每个字符是否包含在您的 randomString 变量中。这是一种略有不同的方法。

public static boolean Checkword(){
    String randomString = "BFEABLDEG";
    String word = "LABEL";
    for(int i=0;i<word.length(); i++){
         if(randomString.indexOf(word.charAt(i)) != -1){
             //If the letter isn't contained return false
             return false;
          } else {
              //If the letter is contained remove it from the string
              int charLocation = randomString.indexOf(word.charAt(i));
              randomString = randomString.substring(0, charLocation) + randomString.substring(charLocation+1);
          }
    }
    //If I haven't returned yet, then every letter is contained, return true
    return true;
}

这是非常低效的,因为它每次都必须创建一个新字符串,如果你想让它变得更好一点,请使用字符串生成器来改变字符串以删除找到的字符。

【讨论】:

  • 你在这里也使用substring(),这是最大的问题之一。
  • 是的,我不是为了提高效率。我喜欢在您的回答中使用replaceFirst,但不知道该方法存在(我假设它每个循环的字符串分配优于 3 个)。
  • 嗯,这不是substring 所指的。我的意思是这个:randomString.contains(word.substring(i)) 这不会检查单个字符的出现,而是检查原始字符串的子序列。例如,在第一个循环循环中,它会检查整个字符串“LABEL”是否包含在“BFEABLDEG”中。
  • 啊我明白你的意思了,改成charAt
  • 嗨。当我尝试这个时,它会产生以下错误。 "String 类型中的方法 contains(CharSequence) 不适用于参数 (char)"
猜你喜欢
  • 2020-07-19
  • 2013-03-13
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 2017-01-08
  • 1970-01-01
  • 2012-05-20
相关资源
最近更新 更多