不使用 toUpperCase() 将小写数组转换为大写
Converting Lowercase array to Uppercase without using toUpperCase()
首先,这是一项家庭作业,我正在寻求帮助,因为我被困住了。我已经为此工作了几个小时,但无法弄清楚。我正在尝试将用户输入作为字符串并将其存储为字符数组,并在不使用 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
}
}
}
}
我认为您不需要数组:
for(int i = 0; i < s2.length; ++i)
{
if('a' <= s2[i] && s2[i] <= 'z')
s2[i] += 'A' - 'a';
}
字符代码保持字母表字符的顺序形式,因此'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();
其他两个答案都会更好地处理您的问题,但为了给您一个非常接近您的示例的答案,下面的答案就可以了
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);
}
}
My plan is to create two arrays which contains the lowercase alphabet and the uppercase alphabet
听起来您对问题采取了错误的方法。
而不是存储 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);
}
}
此代码将...
- 遍历我的字符数组。
- 如果字母在地图中,则获取对应的大写字母并打印出来。
- 否则,只打印字符。
此代码不会在任何地方存储大写字符串,它只是打印它。您可以通过将每个字符附加到 StringBuilder.
来让它变得更好
如果你想要一个更更干净的解决方案(我很遗憾没有想到),我会推荐 Mureinik 的。如果您需要映射某些没有这种一致模式的字符,HashMap 解决方案可能会有所帮助。
首先,这是一项家庭作业,我正在寻求帮助,因为我被困住了。我已经为此工作了几个小时,但无法弄清楚。我正在尝试将用户输入作为字符串并将其存储为字符数组,并在不使用 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
}
}
}
}
我认为您不需要数组:
for(int i = 0; i < s2.length; ++i)
{
if('a' <= s2[i] && s2[i] <= 'z')
s2[i] += 'A' - 'a';
}
字符代码保持字母表字符的顺序形式,因此'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();
其他两个答案都会更好地处理您的问题,但为了给您一个非常接近您的示例的答案,下面的答案就可以了
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);
}
}
My plan is to create two arrays which contains the lowercase alphabet and the uppercase alphabet
听起来您对问题采取了错误的方法。
而不是存储 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);
}
}
此代码将...
- 遍历我的字符数组。
- 如果字母在地图中,则获取对应的大写字母并打印出来。
- 否则,只打印字符。
此代码不会在任何地方存储大写字符串,它只是打印它。您可以通过将每个字符附加到 StringBuilder.
来让它变得更好如果你想要一个更更干净的解决方案(我很遗憾没有想到),我会推荐 Mureinik 的。如果您需要映射某些没有这种一致模式的字符,HashMap 解决方案可能会有所帮助。