【问题标题】:Java string comparsion [duplicate]Java字符串比较[重复]
【发布时间】:2013-12-31 06:54:32
【问题描述】:

我正在尝试实现一个简单的 cesar 密码。我在使用基于新键 [] 对字符串进行编码的函数时遇到问题。在这里,我展示了如何设置我的密钥。

private String[] alphabet =  {"a", "b", "c","d", "e", "f","g", "h", "i","j", "k", "l","m", "n", "o",
            "p", "q", "r","s", "t", "u","v", "w", "x","u", "z"};

public String[] CoderNewKey(int shift) {
    _NewKey = null;
    _NewKey = new String[25];

    for (int i = 0; i < 25; i++) {
        _NewKey[i] = alphabet[(i + shift) % 25];
    }
    return _NewKey;
}

我遇到的问题是 Coder,没有一个 if 语句是真的,而且 rtnstring 总是只是 ""。

public String Coder(String[] key, String msg){
    String rtnstring = "";

    for ( int i = 0; i < msg.length();i++){

        for (int x = 0; x<26 ; x++){
            if ( msg.substring(i, i+1) == alphabet[x]){

                rtnstring.concat(key[x]);
            }if (msg.substring(i, i+1) == " "){

                rtnstring.concat(" ");
            }
        }
    }
    return rtnstring;
}

这是我对编码器方法的逻辑。

它一次通过字符串 msg 1 个字母。它将字母与其在字母表中的索引匹配,然后根据给定键中的索引创建一个新字符串。

【问题讨论】:

  • 在java中,字符串应该总是与equals方法进行比较。你会在这里找到一个很好的解释。thejavageek.com/2013/07/27/…
  • 这种问题每天大约问1-5次。答案是不断泛滥
  • @RafaEl 这个问题有一个有趣的转折点,最好的答案是“不要使用String”。
  • @chrylis 我想我们大多数人都同意这一点。但是我很生气看到 "for string comparison, use equals(), equalsIgnoreCase()" 类型的答案:-/

标签: java string arrays


【解决方案1】:

您想为此使用char 而不是Stringchar 值是单个字符,这是您正在使用的。要比较String 对象,您需要使用equals(),但您可以使用==chars。

【讨论】:

    【解决方案2】:

    您需要使用 String 类中的equals() 方法。当您使用 == 时,您正在比较两个对象的引用变量(在您的代码中不一样)

      +----------+                        +----------+
      |          |     What you need      |          |
      |  "   " <-------to compare-----------> "a"    |
      |          |                        |          |
      |          |                        |          |
      +----------+                        +----------+
           ^                                   ^
           |                                   |
           +              What you             +
       rtnstring <------+ erroneously +---->  msg
                          compare
    

    【讨论】:

      【解决方案3】:

      在 Java 中,== 总是只比较两个引用(即对于非基元) - 即它测试两个操作数是否引用同一个对象。

      但是,equals 方法可以被覆盖 - 所以两个不同的对象仍然可以相等。

      例如:

      String x = "hello";
      String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });
      
      System.out.println(x == y); // false
      System.out.println(x.equals(y)); // true
      

      【讨论】:

        【解决方案4】:

        首先使用函数charAt代替substring,然后将String[]更改为char[],即

        private char[] alphabet =  {'a', 'b', .... , 'z'};
        

        if ( msg.charAt(i) == alphabet[x])
        

        在您的示例中,您使用的是String,而当您使用== 时,它会比较引用,substring 函数将始终返回一个新的string,以避免此类问题,请改用equals(String)

        为了更好地理解,请阅读Java Documentation 该示例将为您提供String 的初始化方式以及references 相等的含义的所有详细信息。

        【讨论】:

          【解决方案5】:

          字符串应该使用equals()方法进行比较,而不是==。 equals() 方法用于检查 String 字面量是否有意义地等价 与否

          public String Coder(String[] key, String msg){
              String rtnstring = "";
          
              for ( int i = 0; i < msg.length();i++){
          
                  for (int x = 0; x<26 ; x++){
                      if ( msg.substring(i, i+1).equals(alphabet[x])){
          
                          rtnstring.concat(key[x]);
                      }if (msg.substring(i, i+1).equals(" ")){
          
                          rtnstring.concat(" ");
                      }
                  }
              }
              return rtnstring;
          }
          

          【讨论】:

            【解决方案6】:
            if ( msg.substring(i, i+1).equalIgnoreCase(alphabet[x])){
                rtnstring.concat(key[x]);
            }
            if (msg.substring(i, i+1).equalIgnoreCase(" ")){
                rtnstring.concat(" ");
            }
            

            你的比较应该使用 equalIgnoreCaseequal 在字符串的情况下,但如果你只想比较字符

            // first define array of characters
            private char[] alphabet =  {'a', 'b', ..... 'z'};
            // then you can use ==
            if ( msg.charAt(i)== alphabet[x]){
                rtnstring.concat(key[x]);
            }
            if (msg.charAt(i) == '\b')){
                rtnstring.concat(" ");
            }
            

            【讨论】:

              【解决方案7】:

              private Char[] 字母 = {'a', 'b', 'c','d', 'e', 'f','g', 'h', 'i','j', 'k'、'l'、'm'、'n'、'o'、'p'、'q'、'r'、's'、't'、'u'、'v'、'w ', 'x','u', 'z'};

              我为你把你的字符串变成了 char(characters)。如果选择改为char,可以继续使用==。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-07-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-06-19
                • 2011-10-19
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多