【问题标题】:breaking down any String分解任何字符串
【发布时间】:2018-09-12 17:30:00
【问题描述】:

大家好,我正忙于破坏/拆分字符串。 但是字符串不是固定的,因此当输入更改时,程序仍然必须处理任何字符输入。

到目前为止,我已经走了这么远,但我迷路了。

我创建了一个字符数组,并将数组的大小设置为等于将作为输入的任何字符串的长度。我做了一个 for 循环来遍历字符串的字符。

我现在如何将我的字符串插入到数组中,因为我知道我的字符串还没有在那里?然后,当它最终遍历我的字符串的字符时,必须在不同的行上打印出数字和操作数。所以在这种情况下,输出看起来像这样;

1

+

3

,

432

.

123

我想在不使用匹配器、扫描器等的情况下做到这一点。我想使用基本的 Java 技术,就像你在 HeadfirstJava 的前 3 章中学到的那样。

public class CharAtExample {

public static void main(String[] args) {

    // This is the string we are going to break down
    String inputString = "1+3,432.123*4535-24.4";

    int stringLength = inputString.length();    

    char[] destArray = new char[stringLength];{

        for (int i=0; i<stringLength; i++);
    }

【问题讨论】:

  • how do I insert my string now into the array 不确定这是什么意思。您希望最终结果是什么样的?
  • 我的输出在我的帖子中“所以在这种情况下输出看起来像这样”
  • 您是在问我们如何将字符串解析tokens?如果是这样,请做一些研究,因为那里有很多关于如何进行解析的文章。
  • 好吧,你没有显示是什么产生了你的输出,那么我们怎么知道你想对内部数据做什么呢?我假设您的意思是您希望数组中的每个元素都保存一行输出。你不能用一个字符数组来做到这一点,因为三个字符(“432”)不能放在一个数组元素中。您必须使用字符串数组或二维字符数组char[][]
  • 我想用基本的技术来做,andreas。稍后这段代码将变成一个计算器。

标签: java arrays string for-loop


【解决方案1】:

您可以使用Character.isDigit(char) 来区分数字字符和非数字字符,因为实际上这是将多个字符分组在同一行中的单一标准。
它会给:

public static void main(String[] args) {

    String inputString = "1+3,432.123*4535-24.4";
    String currentSequence = "";

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

        char currentChar = inputString.charAt(i);
        if (Character.isDigit(currentChar)) {
            currentSequence += currentChar;
            continue;
        }
        System.out.println(currentSequence);
        System.out.println(currentChar);
        currentSequence = "";
    }

    // print the current sequence that is a number if not printed yet
    if (!currentSequence.equals("")) {
         System.out.println(currentSequence);
    }

}

Character.isDigit() 依赖于 unicode 类别。
您可以自己编写代码,例如:

if (Character.getType(currentChar) == Character.DECIMAL_DIGIT_NUMBER) {...}

或者您可以通过检查charint 值是否包含在数字的ASCII 十进制值的范围内,在较低级别对其进行编码:

if(currentChar >= 48 && currentChar <= 57 ) {

它输出你想要的:

1

+

3

,

432

.

123

*

4535

-

24

.

4

【讨论】:

  • 如果我调整字符串它不会打印出最后一个字符。例如1+1+1+1+1输出1+1+1+1+
  • 就像一个魅力!这是我第 2 周的强化 Java 编程,我从来没有想到过这个!
  • 谢谢你,我会的!
【解决方案2】:

这比您想象的要容易。

首先:要获得一个包含字符串字符的数组,您只需使用所有字符串都具有的toCharArray() 方法。
例如。 myString.toCharArray()

第二:当你看到一个字符不是数字时,你想移动到下一行,打印字符然后再次移动到下一行。

以下代码正是这样做的:

public class JavaApplication255 {


public static void main(String[] args) {

    String inputString = "1+3,432.123*4535-24.4";   

    char[] destArray = inputString.toCharArray();

    for (int i = 0 ; i < destArray.length ; i++){
        char c = destArray[i];

        if (isBreakCharacter(c)){
            System.out.println("\n" + c);
        } else {
            System.out.print(c);
        }

    }
}

public static boolean isBreakCharacter(char c){
    return c == '+' || c == '*' || c == '-' || c == '.' || c == ',' ;
} 

【讨论】:

  • 谢谢Bloodeye,作为初学者,这很容易理解!我不知道它是那么“容易”。
  • 我有最后一个问题,为什么引用变量 destArray 需要是 destArray[i] ?为什么它需要 [] 之间的循环中的索引?
  • 一个数组中有很多项。要获得物品,您需要知道它在哪里。例如,要从数组中获取第一项,您可以编写 myArray[0](因为数组从 0 开始计数)。因此,在第一行中,您使用 destArray[i] 获取位置 i 处的字符(记住,循环的每次迭代都会发生变化。它从 0 开始,然后是 1,然后是 2 等等,并在最后一个字符处停止数组)。不确定我是否正确理解了您的问题。所以如果我没有,请详细说明,我会尽力提供帮助。
  • 这正是我想知道的!谢谢!我现在完全理解代码了。
  • 很高兴听到这个消息!玩得开心编程,度过美好的一天!(或夜晚.-.)
【解决方案3】:
char[] charArray = inputString.toCharArray();

【讨论】:

  • 那我做第二个数组?
  • @Amirates 你为什么要第二个char[]
  • 等等我在这里创建一个对象而不是第二个数组?
  • 您正在从字符串中创建一个字符数组。相同的长度相同的值。
  • 我是初学者,所以这个没有任何解释的答案很难。但我现在明白 String 类有一个 .toCharArray 方法。
【解决方案4】:

这是一个可能的解决方案,我们逐个字符地添加到将作为我们的数字的现有字符串中,或​​者将字符串添加到数组中,清除当前数字,然后添加特殊字符。最后,我们循环遍历数组的次数与找到数字或非数字字符一样多。我使用 ASCII 表将字符识别为数字,该表将在您的整个编程生涯中派上用场。最后,我将数组更改为字符串数组,因为字符不能包含像“432”这样的数字,只能包含“4”或“3”或“2”。

String inputString = "1+3,432.123*4535-24.4";

int stringLength = inputString.length();    

String[] destArray = new String[stringLength];
int destArrayCount = 0;
String currentString = "";
for (int i=0; i<stringLength; i++)
{
    //check it's ascii value if its between 0 (48) and 9 (57)
    if(inputString.charAt(i) >= 48 && inputString.charAt(i) <= 57 )
    {
        currentString += inputString.charAt(i);
    }
    else
    {
        destArray[destArrayCount++] = currentString;
        currentString = "";
        //we know we don't have a number at i so its a non-number character, add it
        destArray[destArrayCount++] = "" + inputString.charAt(i);
    }
}
//add the last remaining number
destArray[destArrayCount++] = currentString;

for(int i = 0; i < destArrayCount; i++)
{
    System.out.println("(" + i + "): " + destArray[i]);
}

重要提示 - 如果使用某种类型的字符串,此算法将失败。你能找到这个算法失败的字符串吗?您可以做些什么来确保计数始终正确,而不是有时比实际计数大 1?

【讨论】:

  • 一般评论:这里不是 Raz 将您的 char 数组切换为 String 数组。 String[] destArray = new String[stringLength]; "432" 是一个字符串(三个字符),需要一个字符串来保存它,而不是一个字符。
猜你喜欢
  • 2019-02-14
  • 2012-05-04
  • 2016-02-05
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多