Java字符串分割

3

我有一个字符串,例如“90 60 90” - 身体比例。我想从字符串中提取3个数字并将它们放入int数组中。像这样:

sizes[0] = 90;
sizes[1] = 60;
sizes[2] = 90;

也许有更优雅的方法解决这个问题,但我只能想到这种方式。如果您有更好的方法或者可以帮助修复这个问题,我会非常感激。当 j=2 且 a=' '时,循环停止。
public class Main {

    public static void main(String[] args) {

        String[] sizes = {"90 60 90", "90 70 60"};
    //  int[][] firstNumber = new int[sizes.length][3];
        String firstNumber = "";
        String secondNumber = "";
        String thirdNumber = "";
        int spaces = 0;

        for (int i = 0; i < sizes.length; i++) {
            int length = sizes[i].length();
            for (int j = 0; j < length; j++) {
                char a = sizes[j].charAt(j);
                if (a != ' ' && spaces == 0) {
                    firstNumber += String.valueOf(a);
                } else if (a != ' ' && spaces == 1) {
                    secondNumber += String.valueOf(a);
                } else if (a != ' ' && spaces == 2) {
                    thirdNumber += String.valueOf(a);
                } else if (a == ' ') {
                    spaces++;
                }
            }
        }
        System.out.println(firstNumber + secondNumber + thirdNumber);
    }
} 

感谢您。
Thank you.

2
String::split? - mid
1
int[] array = Stream.of(string.split(" ")).mapToInt(Integer::parseInt).toArray(); - JB Nizet
看起来应该可以工作。我会尝试的,谢谢。我是新手。我试图寻找适当的方法,但我找不到这个简单函数。 - Yevhenii Ivanisenko
5个回答

3

你可以使用:

String[] sizes = {"90 60 90", "90 70 60"};
List<Integer[]> list = Stream.of(sizes).map(
        string -> Arrays.asList(string.split("\\s+")).stream()
                .map(s -> Integer.parseInt(s))
                .toArray(Integer[]::new)
).collect(toList());

展示结果:
list.forEach(array -> System.out.println(Arrays.asList(array)));

输出

[90, 60, 90]
[90, 70, 60]

2
你可以直接使用Stream.of(sizes)或者Arrays.stream(sizes)来流式处理数组,而不是使用Arrays.asList(sizes).stream() - Ward

2

一种优雅的方法是使用流。即:

要检索一个String数组:

String[] result = Arrays.stream(sizes)
                        .flatMap((String s) -> Arrays.stream(s.split(" ")))
                        .toArray(String[]::new);

要检索一个int数组:

int[] result = Arrays.stream(sizes)
                     .flatMap((String s) -> Arrays.stream(s.split(" ")))
                     .mapToInt(Integer::parseInt)
                     .toArray();

那么现在你已经把所有的元素放入了同一个数组中,这是你想要的结果吗? - Ward
@Ward 从描述和接受的答案来看,我认为似乎是这样,这澄清了 OP 想要一个单维数组。 - Ousmane D.
@Aominè 我认为这个更加简洁.. Pattern p = Pattern.compile(" "); Arrays.stream(sizes) .flatMap(p::splitAsStream) .toArray(String[]::new); 但这只是我的个人看法。 - Eugene
@Eugene,确实看起来更整洁,我会记住这一点,以便在未来的回答中使用。由于某种未知原因,我总是习惯于使用s.split(" ")而不考虑其他任何事情。谢谢您,Eugene,我将在适当的情况下记住这一点。 - Ousmane D.
1
@Aominè的习惯难以改变,对我来说也不例外。 - Eugene

2
另一个可能性是:
public class StringToArray {

    // we use this as index counter in our lambda (effectively final)
    private static int index = 0;

    public static void main(String[] args) {

     // our String
     String s = "90 60 90";

     // we declare and initialize our int array to store
     // converted Strings to
     int[] array = new int[s.split(" ").length];

        // split by space, get an array, get stream out of 
        // that array, map each String value to int and save
        // to appropriate index in our int array
        Arrays.stream(s.split(" "))
              .map(Integer::parseInt)
              .forEach(x -> array[index++] = x);

        // print out int array content
        System.out.println(Arrays.toString(array));

    }
}

1

使用StringTokenizer比流更简单。它的构造函数的参数是您想要分隔的字符串。调用nextToken方法可跳转到下一个标记(在此示例中从90到60)。如果没有参数,则标记由空格分隔。这是代码:

import java.util.Arrays;
import java.util.StringTokenizer;

public class test {

    public static void main(String[] args) {

        String[] sizes = {"90 60 90", "90 70 60"};
        StringTokenizer st = new StringTokenizer(sizes[0]);
        int[] sizesInt = new int[6];
        sizesInt[0] = Integer.parseInt(st.nextToken());
        sizesInt[1] = Integer.parseInt(st.nextToken());
        sizesInt[2] = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(sizes[1]);
        sizesInt[3] = Integer.parseInt(st.nextToken());
        sizesInt[4] = Integer.parseInt(st.nextToken());
        sizesInt[5] = Integer.parseInt(st.nextToken());

        System.out.println("sizesInt: " + Arrays.toString(sizesInt));

    }

}

输出:

sizesInt: [90, 60, 90, 90, 70, 60]

1
看起来不错,因为我还没有学习过像ArrayList和Streams这样的结构。谢谢。 - Yevhenii Ivanisenko
你让它变得太复杂了,尽可能使用标准功能(String::split)来简化。 - Ward

1

使用单个for循环和分隔符填充多维数组的另一种方法。应该是有效的。多维数组是保存身体比例信息的直观方式,每行包含与特定身体相关的连贯数据。可扩展,不需要更改,适用于所需的任何数据行数。在jdoodle进行了测试。

public class Main {

    public static void main(String[] args) {

        String[] sizes = {"90 60 90", "90 70 60"};
        String element;
        String[] sizeArray;
        int[][] sizeIntArray= new int[sizes.length][3];

        for (int i = 0; i < sizes.length; i++) {
            element = sizes[i];
            sizeArray=element.split("\\s");
            sizeIntArray[i][0]=Integer.parseInt(sizeArray[0]);
            sizeIntArray[i][1]=Integer.parseInt(sizeArray[1]);
            sizeIntArray[i][2]=Integer.parseInt(sizeArray[2]);
            }
    }
}

@Yevhenii Ivanisenko,这个解决方案可以为您提供您最初在帖子中所追求的多维数组。我根据注释掉的多维数组代码推断出了这一点。如果需要,这种方法也是可伸缩的。 - Lew Perren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接