我正在编写一个程序,用矢量函数进行不同的计算,但我现在的程序界定了负数。我尝试过使用不同的分隔符,但我似乎无法找到合适的分隔符。
有人知道在拆分字符串时如何保留正数和负数?另外,有没有办法保留任何小数值? .45将返回45而.29将返回29
这是代码:
ArrayList<Integer> list = new ArrayList<Integer>();
String twoVectors = "a=<-1,2,-3> b=<4,-5,6>"; // vector and a and b
String[] tokens = twoVectors.split("\\D");
for (String s : tokens)
if (!s.equals(""))
list.add(Integer.parseInt(s));
System.out.println(Arrays.toString(list.toArray()));
当我运行程序时,我得到[1,2,3,4,5,6]而不是[-1,2,3,4,5,6]。我使用的所有功能都非常好,但在使用负值时不起作用。
任何帮助都将不胜感激。
答案 0 :(得分:3)
您可以使用
String[] tokens = twoVectors.split("[^\\d-]+");
[^\\d-]+
:匹配除数字和-
[]
:匹配[]
^
:否定意味着不匹配(\\d-
)
\\d-
:数字0-9
和-
字符
String twoVectors = "a=<-1,2,-3> b=<4,-5,6>";
ArrayList<Integer> list = new ArrayList<Integer>();
String[] tokens = twoVectors.split("[^\\d-]");
for (String s : tokens)
if (!s.equals(""))
list.add(Integer.parseInt(s));
System.out.println(Arrays.toString(list.toArray()));
输出:
[-1, 2, -3, 4, -5, 6]
或者
您可以使用Pattern
和matcher
来查找所有需要的值,即使用-?\\d+
正则表达式
更新:对于Double
值,您可以使用[^\\d-.]+
并确保使用Double
代替Integer
以及{{1} }}
Double.parseDouble
和Pattern
使用-?\\d*\\.?\\d+
答案 1 :(得分:1)
您当前使用的正则表达式将字符串拆分为任何但位数。所以任何不是数字的东西都被认为是分裂者。如果您为此模式添加了-
符号,则会包含任何非数字或-
符号的内容。这适用于某些情况,但如果您-
或.
之后没有数字,则会失败。
您需要做的是在正则表达式中指定数字格式(如-?\d*.?\d+
),然后找到此模式的所有匹配项。您还需要将数字更改为Double
,以便您可以解析十进制数字。
String twoVectors = "a=<-1,.2,-3> b=<4,-5,6>";
ArrayList<Double> numbers = new ArrayList<Double>();
Matcher matcher = Pattern.compile("-?\\d*\\.?\\d+").matcher(twoVectors);
while (matcher.find()) {
numbers.add(Double.parseDouble(matcher.group()));
}
System.out.println(Arrays.toString(numbers.toArray()));
输出
[-1.0, 0.2, -3.0, 4.0, -5.0, 6.0]
答案 2 :(得分:0)
在分割方法中使用[^\\d-]
,即twoVectors.split("[^\\d-]")
为什么[^\\d-]
:
^
:查找必须在该行开头匹配的正则表达式。的任何数字
\d
:来自[0-9]
-
:匹配'-'
(如果存在)
答案 3 :(得分:0)
1行解决方案:
List<Integer> numbers = Arrays
.stream(twoVectors.replaceAll("^[^\\d-]+", "").split("[^\\d-]+"))
.map(Integer::new)
.collect(Collectors.toList());
初始替换是删除前导非目标字符(否则拆分将在第一个元素中返回空白)。