我得到了一系列类似"(123, 234; 345, 456) (567, 788; 899, 900)"
. 如何将这些数字提取到一个数组中aArray[0]=123, aArray=[234], ....aArray[8]=900;
谢谢
我得到了一系列类似"(123, 234; 345, 456) (567, 788; 899, 900)"
. 如何将这些数字提取到一个数组中aArray[0]=123, aArray=[234], ....aArray[8]=900;
谢谢
这可能过于复杂,但是干草......
我们需要做的第一件事是删除所有我们不需要的垃圾......
String[] crap = {"(", ")", ",", ";"};
String text = "(123, 234; 345, 456) (567, 788; 899, 900)";
for (String replace : crap) {
text = text.replace(replace, " ").trim();
}
// This replaces any multiple spaces with a single space
while (text.contains(" ")) {
text = text.replace(" ", " ");
}
接下来,我们需要将字符串的各个元素分离成更易于管理的形式
String[] values = text.split(" ");
接下来,我们需要将每个String
值转换为int
int[] iValues = new int[values.length];
for (int index = 0; index < values.length; index++) {
String sValue = values[index];
iValues[index] = Integer.parseInt(values[index].trim());
}
然后我们显示值...
for (int value : iValues) {
System.out.println(value);
}
策略:找到一个或多个在一起的数字,通过正则表达式添加到列表中。
代码:
LinkedList<String> list = new LinkedList<>();
Matcher matcher = Pattern.compile("\\d+").matcher("(123, 234; 345, 456) (567, 788; 899, 900)");
while (matcher.find()) {
list.add(matcher.group());
}
String[] array = list.toArray(new String[list.size()]);
System.out.println(Arrays.toString(array));
输出:
[123, 234, 345, 456, 567, 788, 899, 900]
你几乎肯定看过这句话:
有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。
但是正则表达式真的是你这类事情的朋友。
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Numbers {
public static void main(String[] args) {
String s = "(123, 234; 345, 456) (567, 788; 899, 900)";
Matcher m = Pattern.compile("\\d+").matcher(s);
List<Integer> numbers = new ArrayList<Integer>();
while(m.find()) {
numbers.add(Integer.parseInt(m.group()));
}
System.out.println(numbers);
}
}
输出:
[123, 234, 345, 456, 567, 788, 899, 900]
遍历每个字符并将数字存储在一个临时数组中,直到找到一个字符(如,
, ;
),然后将临时数组中的数据存储到您的数组中,然后清空该临时数组以供下次使用。
由于您的数字由一组特定的字符分隔,您可以查看该.split(String regex)
方法。
由于您的字符串中可能有许多不同的分隔符,您可以通过它并将所有非数字字符替换为spaces
. 然后,您可以使用split("\\s")
将字符串拆分为带有数字的子字符串数组。最后将它们转换为数字。
此方法将从给定字符串中提取整数。它还处理使用其他字符来分隔数字的字符串,而不仅仅是您的示例中的那些:
public static Integer[] extractIntegers( final String source ) {
final int length = source.length();
final char[] chars = source.toCharArray();
final List< Integer > list = new ArrayList< Integer >();
for ( int i = 0; i < length; i++ ) {
// Find the start of an integer: it must be a digit or a sign character
if ( chars[ i ] == '-' || chars[ i ] == '+' || Character.isDigit( chars[ i ] ) ) {
final int start = i;
// Find the end of the integer:
for ( i++; i < length && Character.isDigit( chars[ i ] ); i++ )
;
// Now extract this integer:
list.add( Integer.valueOf( source.substring( start, i ) ) );
}
}
return list.toArray( new Integer[ list.size() ] );
}
注意:由于整数之后的内部for
循环位置和外部for
循环在搜索下一个整数时会增加i
变量,因此该算法将需要至少一个字符来分隔整数,但我认为这是可取的。例如,"-23-12"
源将产生数字[ -23, 12 ]
而不是[ -23, -12 ]
(但"-23 -12"
会按预期产生 [ -23, -12 ])。
最简单的方法是使用String.indexOf()
(或类似的)和NumberFormat.parse(ParsePosition)
方法的组合。算法如下:
同时,字符串具有特定的结构,因此恕我直言,一些解析器会是更好的方法,因为它还会检查格式的正确性(如果有必要,我不知道)。有很多工具可以根据语法描述生成 Java 代码(如 ANTLR 等)。但对于这个案例来说,这可能是太复杂的解决方案。
我认为您可以使用正则表达式来获得结果。可能是这样的:
String string = "(123, 234; 345, 456) (567, 788; 899, 900)";
String[] split = string.split("[^\\d]+");
int number;
ArrayList<Integer> numberList = new ArrayList<Integer>();
for(int index = 0; index < split.length; index++){
try{
number = Integer.parseInt(split[index]);
numberList.add(number);
}catch(Exception exe){
}
}
Integer[] numberArray = numberList.toArray(new Integer[numberList.size()]);
for(int index = 0; index < numberArray.length; index++){
System.out.println(numberArray[index]);
}
还有一种方式。如果您想编写更少的代码可能会很好,如果您无法将库添加到您的项目中可能会很糟糕
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
public static void main(String[] args) throws IOException {
String text = "(123, 234; 345, 456) (567, 788; 899, 900)";
Splitter splitter = Splitter.onPattern("[,;\\)\\(]").omitEmptyStrings();
String[] cleanString = Iterables.toArray(splitter.split(text), String.class);
System.out.println(Arrays.toString(cleanString));
}
我确信大师可以进一步清理它。
for (int i = 0; i < faces.total(); i++)
{
CvRect r = new CvRect(cvGetSeqElem("(123, 234; 345, 456)", i));
String x=""+Integer.toString(r.x());
String y=""+Integer.toString(r.y());
String w=""+Integer.toString(r.width());
String h=""+Integer.toString(r.height());
for(int j=0;j<(4-Integer.toString(r.x()).length());j++) x="0"+x;
for(int j=0;j<(4-Integer.toString(r.y()).length());j++) y="0"+y;
for(int j=0;j<(4-Integer.toString(r.width()).length());j++) w="0"+w;
for(int j=0;j<(4-Integer.toString(r.height()).length());j++) h="0"+h;
r_return=""+x+y+w+h;
}
上面的代码将返回一个字符串“0123023403540456”
int[] rectArray = new int[rectInfo.length()/4];
for(int i=0;i<rectInfo.length()/4; i++)
{
rectArray[i]=Integer.valueOf(rectInfo.substring(i*4, i*4+4));
}
它会得到 [123, 234, 345, 456]