如何在给定的字符串中打印以下元素?

时间:2015-07-30 01:54:45

标签: java string

给出一个输入:

  

a3b4c5

输出应为:

  

aaabbbbccccc

我是怎么做这个程序的?

我在输入中给出了一个来自用户的字符串,然后检查它的字母是否是第一个 如果它是一个字母,请递增,直到达到要打印的计数器编号 我试图产生相同的输出,但我得到一个跟随行作为输出。

显示输出:

  

代码:

public class Pattern
{
    public static void main(String s[]) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s1 = br.readLine();
        char ch[] = s1.toCharArray();
        for (int i = 0; i < ch.length;) {
            if ((ch[i] <= 65) || (ch[i] >= 90)) {
                i++;
            } else if ((ch[i] <= 97) || (ch[i] >= 122)) {
                i++;
            } else {
                if (ch[i] == '0' || ch[i] == '1' || ch[i] == '2'
                        || ch[i] == '3' || ch[i] == '4' || ch[i] == '5'
                        || ch[i] == '6' || ch[i] == '7' || ch[i] == '8'
                        || ch[i] == '9') {
                    for (int p = 0; p < ch[i]; p++) {
                        System.out.println(ch[i - 1]);

                    }
                }
                i++;
            }
        }
    }
}

6 个答案:

答案 0 :(得分:3)

示例代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Pattern
{
    public static void main(String s[]) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Enter input string: ");
        String inputStr = br.readLine();

        ArrayList<String> stringParts = new ArrayList<>();
        Matcher matcher = Pattern.compile("\\D+|\\d+").matcher(inputStr);
        while (matcher.find())
        {
            stringParts.add(matcher.group());
        }

        // Just to view the contents
        System.out.println("stringParts: " + Arrays.toString(stringParts.toArray()));

        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < stringParts.size(); i += 2) {
            for(int j = 0; j < Integer.parseInt(stringParts.get(i + 1)); j++) {

                sb.append(stringParts.get(i));
            }
        }

        System.out.println("Output: " + sb.toString());
    }
}

<强>输入/输出:

Enter input string: a3b4c5
stringParts: [a, 3, b, 4, c, 5]
Output: aaabbbbccccc

Enter input string: ab2cd3
stringParts: [ab, 2, cd, 3]
Output: ababcdcdcd

Enter input string: abc1def2xyz3
stringParts: [abc, 1, def, 2, xyz, 3]
Output: abcdefdefxyzxyzxyz


  • 使用模式匹配器,将输入字符串拆分为字母和数字
  • 使用字符串构建器相应地附加它们


注意:

这应该是某种形式的Run-length encoding,或者在这种情况下解码。

答案 1 :(得分:2)

这应该可以解决您的问题

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char ch[] = br.readLine().toCharArray();

for (int i = 1; i < ch.length; i++) {
    if (Character.isDigit(ch[i])) {
        for (int j = 0; j < ch[i]-'0'; j++) {
            System.out.print(ch[i-1]);
        }
    }
}

基本上,通过使用单个if语句检查ch [i]是否为数字,您可以避免执行所有其他检查。如果ch [i]是一个数字,则通过从中减去字符“0”将其转换为整数。其余的应该是有意义的。

答案 2 :(得分:2)

以下是使用regex和捕获组的简短示例。这是基于这样的假设:有时你可以有一个模式,其中有一个字符串,后面没有数字。

例如:

a2bc3 => aabccc

正则表达式模式:

"(\\D+)(\\d*)"

模式分解:

  • (\\D+) - 将1个或多个非数字字符捕获到捕获组1
  • (\\d*) - 将0个或更多数字字符捕获到捕获组2

使用StringBuilder构建输出。

如果组2有数据,则将捕获组2转换为整数,这样您就可以知道在结果中重复组1的次数。

public static void main(String[] args) throws Exception {
    List<String> inputs = new ArrayList() {{
       add("a3b4c5");
       add("a3bc5");
       add("a3bc");
       add("abc");
       add("ab3cd4ef5");
       add("a10bc1e10");
    }};

    for (String input : inputs) {
        StringBuilder output = new StringBuilder();

        Matcher matcher = Pattern.compile("(\\D+)(\\d*)").matcher(input);
        while (matcher.find()) {
            String group1 = matcher.group(1);
            String group2 = matcher.group(2);

            int loopCount = 0;
            if (!group2.isEmpty()) {
                loopCount = Integer.parseInt(group2);
            }

            // Always print the group at least once
            output.append(group1);
            // Possibly print more
            for (int i = 1; i < loopCount; i++) {
                output.append(group1);
            }   
        }
        System.out.println(output);
    }
}

结果:

aaabbbbccccc
aaabcbcbcbcbc
aaabc
abc
abababcdcdcdcdefefefefef
aaaaaaaaaabceeeeeeeeee

答案 3 :(得分:1)

前两个if语句意味着你会跳过任何小于或等于的内容 97或大于或等于90:所以你将跳过每一个可能的值。

您可能只想使用Character.isLetter()Character.isDigit()

此外,p < ch[i]应为p < (Integer.valueOf("" + ch[i]));否则1将打印49份。

答案 4 :(得分:1)

你正在采用不等式,你没有采用正确的布尔运算符。此外,您最后需要print而不是printlnprintln。你应该有这样的东西。

import java.io.IOException;
import java.lang.NumberFormatException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class t1

{
    public static void main(String s[]) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s1 = br.readLine();
        char ch[] = s1.toCharArray();
        for (int i = 0; i < ch.length;) {
            if ((ch[i] >= 65) && (ch[i] <= 90)) {
                i++;
            } else if ((ch[i] >= 97) && (ch[i] <= 122)) {
                i++;
            } else {
                if (ch[i] >= '0' && ch[i] <= '9') {
                    for (int p = 0; p < ch[i]-'0'; p++) {
                        System.out.print(ch[i - 1]);

                    }
                }
                i++;
            }
        }
        System.out.println("");
    }
}

答案 5 :(得分:0)

我是这样尝试的,它可能不是最好的,但你可以试试这个

   String st="A3B4C5";
    String st1="";
    int l=0;
    char ar[]=st.toCharArray();
    char c='0';
    for(int i=0;i<ar.length;i++){
    if(Character.isLetter(ar[i])){
    c=ar[i];
        }
    else if(Character.isDigit(ar[i])) {
     l=Character.getNumericValue(ar[i]);     
    for(int j=0;j<l;j++){
    System.out.print(c);
    }   
        }

    }