【问题标题】:How do I check if a char is equal to a hyphen or a character?如何检查 char 是否等于连字符或字符?
【发布时间】:2021-08-30 15:38:48
【问题描述】:

我正在尝试删除文本中的所有下划线或连字符,并且下划线或连字符之前的任何字母都应大写。

我的代码采用字符串参数并将字符串转换为插入堆栈的字符数组。然后我使用一个 while 循环从堆栈中弹出一个字符并使用 if 语句。 if 语句检查字符是否不是下划线或连字符,然后将其附加到字符串变量word。但如果是连字符或下划线,则将word 的第一个字母大写,因为这是最后附加的字符,并且不附加下划线或连字符。

但是,下划线和连字符仍保留在我检查并发现问题的字符串中。出于某种原因,下划线和连字符通过 if 语句 if(character != underscore || character != hyphen) 我不明白为什么当character 是连字符或下划线时,它不等于字符变量underscorehyphen

这是我的代码:

import java.lang.StringBuilder;
import java.util.Stack;

 class Solution{

 static String toCamelCase(String s){
   
  Stack<Character> stack = new Stack<Character>();
  String word = null;
  char underscore = '_';
  char hyphen = '-';
 
  char[] charArray = s.toCharArray();

  for(char character : charArray){
  
   stack.push(character);
  }

  while(!stack.empty()){
  
   char character = stack.pop();
  
   if(character != underscore || character != hyphen){
          
     if(word == null){
      
      word = String.valueOf(character);
     }else{
      
      word = character + word;
     }
   }else{
    
     if(word != null){
      
      char[] wordToCharArray = word.toCharArray();
      char firstLetter = Character.toUpperCase(wordToCharArray[0]);
      wordToCharArray[0] = firstLetter;
      word = String.valueOf(wordToCharArray);
     }
   }
 }

 return word;
}
}

【问题讨论】:

  • 请为你的 || 制定一个简单的真值表。条件是你不明白它为什么会失败。
  • 看起来像是正则表达式的工作!
  • 为自己编写代码的尝试是值得称赞的(如果这是一个类分配,也是可以理解的),但现在大多数人只会使用像 Apache Commons CaseUtils 这样的标准库类。
  • @DavidDenenberg 我不明白你所说的简单真值表是什么意思,if 语句中的条件语句有问题吗?
  • @kshetline 我没有使用正则表达式吗?

标签: java string stack character


【解决方案1】:

这就是你所拥有的。

if(character != underscore || character != hyphen) {

使用De Morgans laws 之一,其中 ( a || b) 等同于!(!a &amp;&amp; !b)

可以改写为:

if (!(character == underscore && character == hyphen)) {

现在,看看内部比较,单个 char 变量可以同时是两个不同的东西吗?由于条件将始终为false! 将其更改为true,因此它将始终为true,就像您的原始表达式一样。这是因为如果您的原始比较之一为假,则另一个必须为真。而且因为它使用的是 OR,所以它总是正确的。

因此,将您的 || 更改为 &amp;&amp;

【讨论】:

  • 但这并不能解决问题,为什么我的 if 语句仍然允许连字符和下划线,而表达式不允许它?
【解决方案2】:

我可以看到您正在尝试按照您的要求检查文本中是否有连字符或下划线,但它存在问题,存在大量嵌套,因此某些代码位于错误的位置它不会执行您的 if 语句,其中没有任何内容,我将重写您的代码,您可以将其粘贴到您的文件中并希望它可以工作(我相信它会。)

import java.lang.StringBuilder;
import java.util.Stack;

 class Solution{

 static String toCamelCase(String s){
   
  Stack<Character> stack = new Stack<Character>();
  String word = null;
  char underscore = '_';
  char hyphen = '-';
 
  char[] charArray = s.toCharArray();

  for(char character : charArray){
  
   stack.push(character);
  }

  while(!stack.empty()){
  
   char character = stack.pop();
  
   if(character == underscore || character == hyphen){
       // Here we're defining the underscore and hyphen
       // So you can remove them if they are there.
       // Make sure next time that you aren't using the not logical
       // Operator when you are checking if the word has it or not rather than
       // It not having it or not, and also add two equals next time to compare
       // Variables to eachother
       underscore = '_';
       hyphen = '-'; 
    character.remove(underscore || hyphen)
     if(word == null){
      word = String.valueOf(character);
     } else {
      word = character + word;
     }
   } else {
    
     if(word != null){
      
      char[] wordToCharArray = word.toCharArray();
      char firstLetter = Character.toUpperCase(wordToCharArray[0]);
      wordToCharArray[0] = firstLetter;
      word = String.valueOf(wordToCharArray);
     }
   }
 }

 return word;
}
}

未来提示:如果您尝试比较一个变量(在本例中为连字符和下划线),请确保使用双等号:(==) 而不是等号:(=),因为这是在声明变量而不是比较它。如果可以的话,我建议您观看有关如何从代码(即 Java)中删除嵌套的 youtube 教程。

【讨论】:

    【解决方案3】:

    你只需要改变条件:

    if (character != underscore && character != hyphen)
        // do smth.
    else if(word != null)
        // do smth.
    

    我认为您可以重新格式化您的代码并简化逻辑:

    public static String toCamelCase(String str) {
        StringBuilder buf = new StringBuilder(str.length());
        boolean upperCase = false;
    
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
    
            if (ch == '-' || ch == '_')
                upperCase = true;
            else {
                buf.append(upperCase ? Character.toUpperCase(ch) : ch);
                upperCase = false;
            }
        }
    
        return buf.toString();
    }
    

    【讨论】:

      【解决方案4】:

      使用 Java 9(或更高版本)和正则表达式,您可以像这样简单:

      import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      
      public class Playground {
          static Pattern kebobPattern = Pattern.compile("[-_][a-z]");
      
          public static String toCamelCase(String s) {
              return kebobPattern.matcher(s).replaceAll(m -> m.group().substring(1).toUpperCase());
          }
      
          public static void main(String[ ] args) {
              System.out.println(toCamelCase("sample-string-with_punctuation"));
              System.out.println(toCamelCase("another_sample-foo_bar-baz"));
          }
      }
      

      输出:

      sampleStringWithPunctuation
      anotherSampleFooBarBaz
      

      请注意,此代码不会删除所有短划线和下划线。为了将 kebab case 转换为 camel case 的特定目标,我对此进行了简化,因此只有破折号或下划线后跟小写字母会被替换。您可以根据需要调整它以获得更多/不同的功能。

      【讨论】:

        猜你喜欢
        • 2016-12-21
        • 1970-01-01
        • 2014-07-29
        • 2017-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        • 2021-10-12
        相关资源
        最近更新 更多