不使用toUpperCase()将小写数组转换为大写

时间:2016-09-03 16:04:25

标签: java arrays string uppercase

首先这是一个家庭作业,我正在寻找一些帮助,因为我被困住了。我已经在这个工作了好几个小时,无法弄明白。我正在尝试将用户输入作为字符串并将其存储为char数组,并在不使用toUpperCase()方法的情况下输出所有大写字符。

到目前为止,我已经编写了代码,我的计划是创建两个包含小写字母和大写字母的数组,并创建和for循环,并在其中创建一个if语句,用于替换char数组中的字符并输出它们在大写。但我无法弄清楚如何更换角色。这是我到目前为止所得到的:

import java.util.Scanner;
class Q4{
    public static void main(String []args){
        Scanner input = new Scanner(System.in);
        System.out.print("Enter a String: ");
        String s = input.nextLine();
        String s1 = s.toLowerCase(); 
        char[] s2 = s1.toCharArray(); //Converts the String into a char Array

        char LowerAlp[] = {'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'};
        char UpperAlp[] = {'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<s2.length; i++){
            if(s2==LowerAlp){
                //Here is the problem
            }

        }
    }
}

4 个答案:

答案 0 :(得分:3)

我认为你不需要数组:

for(int i = 0; i < s2.length; ++i)
{
    if('a' <= s2[i] && s2[i] <= 'z')
        s2[i] += 'A' - 'a';
}

答案 1 :(得分:2)

字符代码将字母字符保持为顺序形式,因此'a''A'之间的差异与'b''B'之间的差异相同。这些知识可用于将小写转换为大写:

int diff = 'A' - 'a';
String lower = "this is lowercase";
StringBuilder sb = new StringBuilder(lower.length());
for (char c : lower.toCharArray()) {
    if (c >= 'a' && c <= 'z') {
        c = (char)(c + diff);
    }
    sb.append(c);
}
String upper = sb.toString();

答案 2 :(得分:1)

其他两个答案将更好地处理您的问题,但为了给您一个非常接近您的示例的答案,以下将完成这项工作

import java.util.Scanner;
class Q4{
    public static void main(String []args){
        Scanner input = new Scanner(System.in);
        System.out.print("Enter a String: ");
        String s = input.nextLine();
        String s1 = s.toLowerCase();
        char[] s2 = s1.toCharArray(); //Converts the String into a char Array
        char[] res = new char[s2.length];

        char LowerAlp[] = {'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'};
        char UpperAlp[] = {'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'};

        String lowerAlphabet = new String(LowerAlp);

        int i = 0;
        for (char aS2 : s2) {
            res[i++] = UpperAlp[lowerAlphabet.indexOf(aS2)];
        }

        System.out.println(res);
    }
}

答案 3 :(得分:1)

  

我的计划是创建两个包含小写字母和大写字母

的数组

听起来你的问题采取了错误的方法。

而不是存储2个数组,HashMap将是更好的选择。使用HashMap,您可以将所有小写字符显式映射为大写字符。

实施例

1。初始化HashMap

HashMap<Character, Character> uppercaseAlphabet = new HashMap<Character, Character>();

这将为您创建一个新的HashMap,将字符映射到其他字符

不要忘记import java.util.HashMap

2。使用字母

填充HashMap
uppercaseAlphabet.put('a', 'A');
uppercaseAlphabet.put('b', 'B');
uppercaseAlphabet.put('c', 'C');

等等......您需要为字母表的其余部分执行此操作,否则您可能会遇到NullPointerException

3。使用HashMap

char[] myLetters = "hello world!".toCharArray();

for (char letter : myLetters) {
    if (uppercaseAlphabet.contains(letter) {
        char uppercaseLetter = uppercaseAlphabet.get(letter);
        System.out.print(uppercaseLetter);
    } else {
        System.out.print(letter);
    }        
}

此代码将......

  1. 遍历我的角色阵列。
  2. 如果字母在地图中,请获取大写字母并打印出来。
  3. 否则,只需按原样打印字符。
  4. 此代码不会将大写字符串存储在任何位置,只是打印它。你可以通过将每个字符附加到StringBuilder来使它更好。

    如果你想要一个很多更清洁的解决方案(我后悔没想到),我会推荐Mureinik的。虽然如果你需要映射那些没有这种一致模式的某些字符,HashMap解决方案可能会有所帮助。