【问题标题】:In a String, how can I separate & store the characters and integers?在字符串中,如何分隔和存储字符和整数?
【发布时间】:2014-01-10 14:22:49
【问题描述】:

我的任务是创建一个 Bubble Breaker 类型的游戏,我将我的任务分解为几个较小的任务,结果碰壁了。

我创建了一个 2D Array Grid,它会在程序启动时随机使用不同颜色的气泡。每行和每列都有编号,行的范围是数字,列的范围是字母。

我的目标是让用户输入选择一个字符串(注意我只能使用字符串,因为我在预先设计的控制台中编程),例如 B10、B9 或 10B。

我可以通过

检查字符是数字还是字母
command.charAt(i) >= '0' && command.charAt(i) <= '9' // i is a counter in a for

上面可以让我找到是数字还是数字,问题是要选择确切的网格位置,我需要,但不能:

  • 将字符串分成整数和字符
  • 加入两个积分器 (注意它们可以是 B9、B10 或 10B)

This is an example of the duality B10 and 10B

【问题讨论】:

  • 对,是java,之前忘记加标签了,现在加了,谢谢:)
  • "10B""B10"一样吗?
  • 所以你只想把B和10分开?
  • Scriptwise 这是问题之一,而对于用户来说它是相同的(第 10 行,第 2 行)(第 2 行,第 10 行),但对于程序却不是。是的,在不分离 1 和 0(因此为 10)的情况下分离 B 是问题之一。这很容易,但我不知道它们将处于哪个位置/长度(B10 = 10B / B9 = 9B)
  • 您是否考虑过使用正则表达式来简化字符串的解析?

标签: java string char int type-conversion


【解决方案1】:

你只需要两行:

int num = Integer.parseInt(str.replaceAll("\\D", ""));
String letter = str.replaceAll("\\d", "");

字符串中字母和数字的顺序无关紧要 - 这两种方式都可以。

根据以下 cmets 进行了编辑以满足要求

要处理较大字符串中的一系列字母-数字对,将字母解析为 int x(其中 A=1、B=2 等)并将数字分配给 int y,您可以在空格上拆分字符串并使用类似于上面的代码:

for (String pair : command.toUpperCase().split("\\s+")) {
    int x = pair.replaceAll("\\d", "").charAt(0) - '@';
    int y = Integer.parseInt(pair.replaceAll("\\D", ""));
}

使用split() 意味着不必为使用循环变量的乏味而玷污自己。

减去'@' 的原因是'A' 前面的字符,所以减去它会将A 转换为1B 转换为2,等等。


这是一些测试代码:

String command = "A5 B10 11C 20D";
for (String pair : command.split("\\s+")) {
    int x = pair.replaceAll("\\d", "").charAt(0) - '@';
    int y = Integer.parseInt(pair.replaceAll("\\D", ""));
    System.out.format("X = %d, Y = %d\n", x, y);
}

输出:

X = 1, Y = 5
X = 2, Y = 10
X = 3, Y = 11
X = 4, Y = 20

【讨论】:

  • @peeskillet 感谢您的关注 :) “代码越少越好”是我的座右铭(只要它是可读的)。一点正则表达式的功夫可以大大减少您需要的代码量,这真是令人惊讶。
  • @peeskillet 谢谢!那很快。你需要投票吗(已经给了你最高的答案)?毕竟是圣诞节
  • 这是一个很好的问题,但我必须坚持使用 peeskillet 的方法,我拥有的下一段代码正是将字符转换为取决于其他因素的整数值(用户可以选择网格大小和位置,这会影响给定的坐标),所以另一种方法允许我只在现有代码中包含那个缺失的链接。这是一个很棒的遮阳篷,不过我真的很感激 :)
  • 你的意思是它必须在循环内的command 的索引i 处工作?
  • 是的,因为下面的代码。单个字母 (char) 转换为 X 整数坐标,而另一个整数也转换为 Y 整数坐标。这种方法不允许我用当前的代码来做,或者至少,我没有足够的经验来实现它
【解决方案2】:

要回答这个问题,只需使用 if 循环。 (如果第一个字符是数字,则将除最后一个字符之外的所有字符解析为整数,否则将从第二个字符开始的所有字符解析为整数。)(如果您只想知道,请使用 String.substring(start, end) 将其分开) 此外,您可以使用 Character.isDigit() 代替

command.charAt(i) >= '0' && command.charAt(i) <= '9'

(只是为了代码的易读性)

【讨论】:

  • 是的,但是我无法在将数字保持在一起以创建整数的同时分离字符
【解决方案3】:
  • 遍历字符串
  • 检查字符是否为字母
  • 将该字母保存到变量中 (char letter)
  • 替换原始字符串,使字母被替换为空 (String numString)
  • 现在您将它们分开了:letternumString
  • 这适用于B1010B。并设置只有一个字母和其余数字

查看代码

String code = "10B";

char letter;

for (char c : code.toCharArray()){
    if (Character.isLetter(c)){      // if the character is a letter, save if the "letter"
        letter = c;
        break;
    }
}

String numString = code.replace(letter, "");  // replace the original string, letter for ""
// Parse if you need to 
int num = Integer.parseInt(numString);

// You have the letter by itself, and the number by itself    
System.out.println("Letter: " + letter + ", Number: " + num);

编辑:试试下面的代码。我在上面的一个中有几个错误

    String code = "10B";

    char letter = ' ';    // <-- initialize

    for (char c : code.toCharArray()) {
        if (Character.isLetter(c)) {      // if the character is a letter, save if the "letter"
            letter = c;
            break;
        }
    }

    String numString = code.replace(String.valueOf(letter), "");  <-- String valueOf
    int num = Integer.parseInt(numString);
    System.out.println("Letter: " + letter + ", Number: " + num);

结果:Letter: B, Number: 10

【讨论】:

  • 我在测试该代码时遇到错误:'String 类型中的方法 (char,char) 不适用于参数 (char,String)' 我尝试修复它,但我根本做不到用它找到任何错误(我可以修复)
  • 你的意思是 .reaplace()?
  • 对不起,String numString = code.replace(letter, "");
  • 没错,这解决了它 =) 我也尝试初始化它,但真正破解它的是 .valueOf(letter) 。谢谢你的帮助,我真的很感激 =) 现在我可以将它应用到网格上,再次感谢你
  • 你能再推我一下吗?我把那个代码分成两部分,一个给我号码,另一个给我字母。在这两个代码上,我都会处理信息以获取网格上的坐标。我的问题是,当我运行它时出现运行时错误,因为字符串在开始时为空,我尝试给它一个值但它没有效果,Exception in thread "main" java.lang.NullPointerException at projecto.MotorDeJogo.getcv(BubblesBreaker.java:201) 即:String numString = test.replaceAll(String.valueOf(letter), ""); getch( )。
【解决方案4】:
public class StringSpliter {

public static void main(String[] args) {
    ArrayList<Character> chars = new ArrayList<>();
    ArrayList<Integer> ints = new ArrayList<>();
    String str = "T23his i43s a Stin4g Whi12ch C1on3431tains Ch 5ara32cter2343s and Alphabets";

    char[] mychars = str.toCharArray();

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

        if (mychars[i] >= 33 && !(mychars[i] <= '9' && mychars[i] >= '0')) {
            chars.add(mychars[i]);
        } else if (mychars[i] >= '0' && mychars[i] <= '9') {

            ints.add((Integer.parseInt(""+mychars[i])));
        }
    }
    for (int i = 0; i < chars.size() + ints.size(); i++) {
        if (i < chars.size()) {
            System.out.println(chars.get(i));
        } else {
            System.out.println(ints.get(i - chars.size()));
        }
     }
   }
 }

试试上面的代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2016-05-22
    • 2013-05-23
    相关资源
    最近更新 更多