【问题标题】:Having trouble changing characters in strings更改字符串中的字符时遇到问题
【发布时间】:2014-11-01 03:47:16
【问题描述】:

所以问的问题是:要更改前面有 3 个字符的字符串的字符,假设字符串是“AB cd”,它将更改为:“DE fg”。我不擅长编程,但我已经尽力而为:

import java.util.*;

public class encrypt{

    public static void main(String[] args){

        Scanner reader = new Scanner(System.in);
        System.out.println("Enter a message to encrypt: ");
        String message = reader.nextLine();

        List<Character> Lowercase = Arrays.asList('a','b','c','d','e','f','g','h','i','j',
  'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');

        List<Character> Uppercase = Arrays.asList('A','B','C','D','E','F','G','H','I','J',
  'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');

        for ( int i = 0; i < message.length(); i++ ) {  
            char c = message.charAt( i );

            if( c == ' '){
                continue;
            }
            else if (c != ' '){
                for ( int i = 0; i < Lowercase.size(); i++ ) {
                    char b = Lowercase.indexOf(i);

                    if(c == b){
                        message.charAt(i)=Lowercase.indexOf(i+3);
                    }
                }
            }

            for ( int i = 0; i < Uppercase.size(); i++ ) {
                char j = Uppercase.indexOf(i);

                if(c == j){
                    message.charAt(i)=Uppercase.indexOf(i+3);
                }
            }
        }
    }               
}

我遇到了如下错误:

Problem1.java:20: error: variable i is already defined in method main(String[]) for ( int i = 0; i < Lowercase.size(); i++ ) { ^ Problem1.java:21: error: possible loss of precision char b = Lowercase.indexOf(i); ^ required: char found: int Problem1.java:23: error: unexpected type message.charAt(i)=Lowercase.indexOf(i+3); ^ required: variable found: value Problem1.java:27: error: variable i is already defined in method main(String[])

任何帮助将不胜感激 :) 谢谢。

【问题讨论】:

  • 你应该使用 j 或其他变量名作为你的内循环索引
  • 这里的问题太多了...我建议您删除代码,直到出现一个编译器错误,然后提出一个具体的问题。
  • @ChrisMartin 我的问题主要是如何将用户输入字符串中的字符与小写/大写字符进行比较,然后用小写/大写字符替换用户输入字符串数组
  • @JamaJurayevich 我已经尝试过了,但仍然没有任何帮助:\
  • @Finn 你有很多问题和误解。如果您愿意,我可以帮助您用更好的方法解决这个问题

标签: java string loops for-loop


【解决方案1】:

我相信有一种更简单的方法可以解决您的问题,您可以在ASCII table 找到您的答案

如您所见,单词有一些与它们相关的数字,例如大写A65,小c99,因此,您可以通过数字并使用转换过程来获取字符你想要的。

read more casting from string to int

我觉得你应该试试这个

代码:

        String s = "eh az";
        for (int i = 0; i < s.length(); i++) {
            int a = s.charAt(i);
            if (a >= 97 && a <= 119) {
                System.out.print((char) (s.charAt(i) + 3));
            } else if (a >= 120 && a <= 122) {
                a -= 23;
                System.out.print((char) a);
            } else if (a == 32) {
                System.out.print(" ");
            }
        }

输出:

hk dc

【讨论】:

  • 这很好,但使用 Unicode 表而不是 ASCII 表。 Java 的 Character 包含一个 UTF-16 代码单元,其中一个或两个编码一个 Unicode 代码点。
  • @TomBlodget 说得好,但我不想让 OP 的生活变得更复杂,因为正如你所见,OP 是新手。有时有必要让生活更轻松,以便让新手更容易理解这个概念:)
  • 但是,当程序员认为 ASCII 几乎没有在任何地方使用时,它可能会出现很多问题。我认为他们不应该从学习 ASCII 开始。
【解决方案2】:

这是一种解决方案。将其与您当前的代码进行比较,看看如何纠正您的错误。

我也做了它,所以它会在字母表末尾的字母循环到数组的前面。 IE:输入字母'Z'会输出'C'。

import java.util.*;

class encrypt
{
    public static void main (String[] args) throws java.lang.Exception
    {
        char c,b,j;

        Scanner reader = new Scanner(System.in);
        System.out.println("Enter a message to encrypt: ");
        String message = reader.nextLine();

        char[] messageArray = message.toCharArray();

        List<Character> Lowercase = Arrays.asList('a','b','c','d','e','f','g','h','i','j',
        'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');

        List<Character> Uppercase = Arrays.asList('A','B','C','D','E','F','G','H','I','J',
        'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');

        for (int i = 0; i < message.length(); i++ ) {  
            c = messageArray[i];
            if (c != ' '){
                for (int x = 0; x < Lowercase.size(); x++ ) {
                    b = (char)(Lowercase.get(x));
                    if(c == b){
                        int n = (x+3)%Lowercase.size();
                        messageArray[i]=Lowercase.get(n);
                    }
                }
                for (int y = 0; y < Uppercase.size(); y++ ) {
                    j = (char)(Uppercase.get(y));
                    if(c == j){
                        int m = (y+3)%Lowercase.size();
                        messageArray[i]=Uppercase.get(m);
                    }
                }
            }
        }
        System.out.println(messageArray);
    }
}

【讨论】:

  • 非常感谢!我把这个和我的比较我想看看你做了什么不同,因为我真的很想了解 java。
  • 很高兴为您提供帮助。如果您有任何问题或不明白某些代码行的含义,请告诉我,我可以帮助解释。
【解决方案3】:

除了与 dmcqu314 的答案一起提供的有用链接之外,这里还有一些关于您的代码和发生的错误的想法。

第 20 行错误

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

正如@Jama Jurayevich 所说,您确实应该为内部循环使用除“i”之外的另一个变量。例如,使用“k”。这会有所帮助 - 因为其他错误,所以帮助不大。

第 21 行错误

char b = Lowercase.indexOf(i);

Lowercase.indexOf(i) 将检索一个(有符号的)int 类型。将其分配给 char 类型(char b)会引发类型转换为类似 unsigned int(即 char)的类型 - 因此暗示“可能丢失精度”。

第 23 行错误

message.charAt(i)=Lowercase.indexOf(i+3);

在这里,您尝试将 int 值分配给 string 方法。这根本不可能。字符串是 Java 中的最终对象。并且没有办法将某些东西分配给方法。如果你想将一个字符附加到字符串,你可以这样做(例子):

String newString = new String();
...
newString = newString + 'a'

椭圆用于您选择的其他编码。

希望这些提示能帮助您解决一些困惑。

【讨论】:

    【解决方案4】:

    我猜你想要完成的是凯撒密码。看看这个帖子: Java Int & ASCII Question

    【讨论】:

    • 是的,我正在努力做到这一点,我会看看谢谢 :)
    猜你喜欢
    • 2013-05-25
    • 2017-02-09
    • 2015-01-03
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多