【问题标题】:Find all numbers in the String [closed]查找字符串中的所有数字[关闭]
【发布时间】:2012-11-06 14:09:48
【问题描述】:

例如我有输入字符串:"qwerty1qwerty2";

作为输出我想要 [1,2].

我目前的实现如下:

import java.util.ArrayList;
import java.util.List;

public class Test1 {

    public static void main(String[] args) {
        String inputString = args[0];
        String digitStr = "";
        List<Integer> digits = new ArrayList<Integer>();

        for (int i = 0; i < inputString.length(); i++) {
            if (Character.isDigit(inputString.charAt(i))) {
                digitStr += inputString.charAt(i);
            } else {
                if (!digitStr.isEmpty()) {
                    digits.add(Integer.parseInt(digitStr));
                    digitStr = "";
                }
            }
        }
        if (!digitStr.isEmpty()) {
            digits.add(Integer.parseInt(digitStr));
            digitStr = "";
        }

        for (Integer i : digits) {
            System.out.println(i);
        }
    }
}

但经过仔细检查后,我忽略了几点:

  1. 某些代码行重复两次。

  2. 我使用列表。我认为这不是一个好主意,最好使用数组。

那么,你怎么看?

您能提供任何建议吗?

【问题讨论】:

  • 不允许使用正则表达式?
  • 我的想法完全一样,使用正则表达式和String#replaceAll(...)
  • 对于代码审查,请使用代码审查堆栈交换站点 :)

标签: java string algorithm


【解决方案1】:

使用全部替换:

String str = "qwerty1qwerty2";      
str = str.replaceAll("[^0-9]+", " ");
System.out.println(Arrays.asList(str.trim().split(" ")));

输出:

[1, 2]

[编辑]

如果要包含- a.e 减号,请添加-?

String str = "qwerty-1qwerty-2 455 f0gfg 4";      
str = str.replaceAll("[^-?0-9]+", " "); 
System.out.println(Arrays.asList(str.trim().split(" ")));

输出:

[-1, -2, 455, 0, 4]

说明

[^-?0-9]+
  • + 一次到无限次,尽可能多次,按需回馈
  • -? 字符“-?”之一
  • 0-9 介于“0”和“9”之间的字符

【讨论】:

  • 你应该输入str = str.replaceAll("[^-?0-9]+", " ");来匹配负数。
  • @JelledeFries,好吧,谁知道- 是表示为minus 还是hyphen
  • @JelledeFries 如果需要,我用“-”支持编辑了我的答案
  • @MaximShoustin 你是对的,这取决于问题。我遇到了一个需要识别负数的问题。
  • 但上述解决方案似乎不适用于“0.0”。有关如何解决此问题的任何建议?
【解决方案2】:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

...

Pattern pattern = Pattern.compile("[0-9]+"); 
Matcher matcher = pattern.matcher("test1string1337thingie");

// Find all matches
while (matcher.find()) { 
  // Get the matching string  
  String match = matcher.group();
}

是一种正则表达式解决方案。

【讨论】:

  • 其实,让我看看这里的模式是否正确使用,只是快速搜索了一下,即兴发挥。好久没用过java和regexp了。
  • 是的,它匹配。只需将结果添加到您选择的某个容器中即可。
【解决方案3】:

试试这个代码

String s = "qwerty1qwerty2";
for(int i=0;i<s.length();i++)
{
   if(Character.isDigit(s.charAt(i)))
   System.out.print(s.charAt(i)+"  ");
}

【讨论】:

  • 这一行呢:“123fgfgfgfgfgfgv5kkk60”。预期结果是 [123, 5, 60]。
  • 修改代码 int len = s.length(); for(int i=0;i
  • @user1831612 编辑您的答案;不要试图将代码填充到注释中——它难以辨认。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
相关资源
最近更新 更多