【问题标题】:how do I properly split this string after the first position (0) so that the one or more characters after 0 are read?如何在第一个位置 (0) 之后正确拆分此字符串,以便读取 0 之后的一个或多个字符?
【发布时间】:2016-10-05 12:02:38
【问题描述】:

基本上我有这个代码,输入 2 个 OR 3 个字母/数字组合,如(AH、10D、JS 和 7C)作为花色值(红桃 A、方块10,黑桃J,梅花7。)

为什么,如果我输入“10D”,代码什么也没有打印出来?为什么不是注册10?我怎样才能解决这个问题? 还:请帮我弄清楚如何将案例 2 - 案例 10 的范围缩短为更有说服力的内容?我不能使用 if-then-else 语句。

System.out.print("Please enter a letter/integer of a playing card (A, J, Q, K, or 2 - 10),\nfollowed by card type (D, H, S, C):");
    Scanner kbd = new Scanner(System.in);
    String userInput = kbd.next().toUpperCase();
    String valueofCard = userInput.substring(0, userInput.length() / 2);  // gives first half of string
    String suitofCard = userInput.substring(userInput.length() / 2); //give last half of string with + 1 if odd
    StringBuilder result = new StringBuilder();

    switch (valueofCard) {
    case "A":
        result.append("Ace of ");
        break;
    case "J":
        result.append("Jack of ");
        break;  
    case "Q":
        result.append("Queen of ");
        break;  
    case "K":
        result.append("King of ");
        break;
    case "2":
    case "3":
    case "4":
    case "5":
    case "6":
    case "7":
    case "8":
    case "9":
    case "10":          
        result.append(valueofCard + " of ");
    break;  
        }

    switch (suitofCard) {
    case "D":
        result.append("Diamonds");
        break;  
    case "H":
        result.append("Hearts");
        break;      
    case "S":
        result.append("Spades");
        break;      
    case "C":
        result.append("Clubs");
        break;
        }

    System.out.println(result.toString());

    kbd.close();

【问题讨论】:

  • 根据您的解释,输入的长度将是 2 或 3 个字符,那么为什么不这样编码呢?
  • 你是什么意思?这是指向另一个人的问题的链接,该问题说明了我的确切周长,也许(?)解释了为什么我以这种格式编码。 stackoverflow.com/questions/39834840/…

标签: java split playing-cards


【解决方案1】:

如果你使用正则表达式,它也会拒绝你的错误输入。

正则表达式:([AJQK2-9]|10)([DHSC])

示例代码:

String card = "QS"; // Queen of Spades

Pattern cardPattern = Pattern.compile("([AJQK2-9]|10)([DHSC])");

Matcher m = cardPattern.matcher(card);
if (! m.matches()) {
    System.out.println("Not a valid card: " + card);
} else {
    String rank = m.group(1);
    String suit = m.group(2);
    // code here
}

【讨论】:

    【解决方案2】:

    针对特殊情况编写代码更简单

    喜欢

    String valueofCard = userInput.substring(0, 1);
    // unless starts with "10"
    if (userInput.startWith ("10")) {
      valueofCard = userInput.substring(0, 2);     
    }
    

    【讨论】:

    • 这个子字符串方法很难实现,因为我不能在我的程序中使用 if-then-else 语句
    • 抱歉,不知道我们在踢足球,但没有腿。 OK 使用 switch 语句来确定输入的长度
    • 我同意你的看法......无论哪种方式都非常感谢你。我不得不在半夜交作业。我说把那四张 10 的牌搞砸了,哈哈
    【解决方案3】:

    我认为问题在于,作为整数,3 / 2 = 1 因此当您输入 10D 时,子字符串会将位置计数器读取为 1 而不是 2,这使得字符串 1 而不是 10,这不会被处理根据你的情况。

    我会推荐使用任何一个

    if(userInput.length()>2)
    {
        String valueofCard = userInput.substring(0,2);
        String suitofCard = userInput.substring(2);
    }
    else
    {
        String valueofCard = userInput.substring(0,1);
        String suitofCard = userInput.substring(1);
    }
    

    【讨论】:

    • 我知道这是我的问题,但它是其他变量的最简单解决方案......所以我认为到这一点我可以编写一个简单的代码或计算来帮助解决这个 10 的情况
    • @m bunn 只需将其更改为 case 1 或编写一些 if else 语句来根据用户输入的长度是 2 个还是 3 个字符来决定将端点指向的位置。最简单的方法是让它大小写为 1 而不是大小写为 10。
    • 将其更改为 case of 1 仅返回 "1 of " 而没有花色。这与 10 的(花色)不同。此外,它仍然是误读,因此没有西装,因为“10”中的0被除法......请帮助!这是一个好主意;)
    • @m bunn 哦,我没有意识到。我不经常使用案例。看看我在原始帖子中输入的代码是否适合您。
    • 看看上面的答案,这让我也使用 if-else 语句,除非你有其他想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多