Java将列表分为两部分

时间:2018-08-29 15:53:42

标签: java list

我有一个列表:

 [132567,Amelia, 123476,Charlie, 123516,Emily, 143456,George, 123466,Harry, 123457,Jack, 125456,Joshua, 132456,Lily, 123456,Oliver]

我想将此列表分为两部分,所以一个列表是ID,另一个列表是NAMES。还要求ID [1]必须与NAME [1]相对应,依此类推。

因此,从本质上讲,我希望有两个这样的列表:

id    = [132567, 123476, 123516, 143456, 123466, 123457, 125456, 132456, 123456]
names = [Amelia, Charlie, Emily, George, Harry, Jack, Joshua, Lily, Oliver]

如何以最简单的方式执行此操作? 谢谢

4 个答案:

答案 0 :(得分:1)

如果您确定ID始终以数字开头并且名称不是以数字开头,则可以尝试此操作。

String text = "132567, Amelia, 123476, Charlie, 123516, Emily, 143456, George, 123466, Harry, 123457, Jack, 125456, Joshua, 132456, Lily, 123456, Oliver";

ArrayList id = new ArrayList(), name = new ArrayList();
String[] split = text.split(",");
for (String string : split) {
    if (Character.isDigit(string.trim().charAt(0))) {
        id.add(string.trim());
    } else {
        name.add(string.trim());
    }
}

如果要获取第6个元素,

System.out.println(id.get(5));
System.out.println(name.get(5));

输出应为

123457
Jack

答案 1 :(得分:0)

您可以按谓词进行分区(例如,一个与正则表达式上的字符串匹配的谓词):

String text = "132567,Amelia, 123476,Charlie, 123516,Emily, 143456,George, 123466,Harry, 123457,Jack, 125456,Joshua, 132456,Lily, 123456,Oliver";

Map<Boolean, List<String>> split = Arrays.asList(text.split(","))
        .stream().map(String::trim)
        .collect(Collectors.partitioningBy(s -> s.matches("^\\d+$")));

返回

{false=[Amelia, Charlie, Emily, George, Harry, Jack, Joshua, Lily, Oliver], 
true=[132567, 123476, 123516, 143456, 123466, 123457, 125456, 132456, 123456]}

true是数字列表(与数字模式匹配),而false是名称列表(与数字模式不匹配)。

答案 2 :(得分:0)

因此,假设您有一个如下列表,可以通过与正则表达式匹配来迭代和分隔字符串和整数项目:

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("1234", "sadf", "1234124", "asdfas");

        List<String> idList = new ArrayList(); // you can make it String or Integer
        List<String> nameList = new ArrayList();

        for (String item : list) {
            // here we distinguish digits only
            if (item.matches("^[0-9]*$")) {
                idList.add(item);
            }else {
                nameList.add(item);
            }
        }

        idList.forEach(System.out::println);
        System.out.println("");
        nameList.forEach(System.out::println);
    }
}

输出:

1234
1234124

sadf
asdfas

答案 3 :(得分:0)

答案取决于您是否打算使用特定方法来解决此练习。

如果应该使用数组,则需要学习如何分辨特定项目的数组索引号是偶数还是奇数,以便可以将相应的项目定向到其他数组之一。查看模运算符。

如果您应该使用字符串,并且列表的格式与您所写的完全相同,那么您需要考虑可以使用哪些字符将列表首先分成几对,然后再拆分将它们配对成单独的项目,然后将其添加到其相应的列表中。

在不太可能发生的情况下,您应该使用“列表”的情况,那么上述数组的方法将起作用,但是基于问题的复杂性,我猜测列表会在以后出现。