Java разделить список на два

У меня есть список:

 [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]

Как мне сделать это самым простым способом? Спасибо

Вы можете получить все элементы с четным индексом (0, 2, 4 ...) и поместить все их в id array, а элементы с нечетным индексом (1, 3, 5 ...) поместить в names array

KunLun 29.08.2018 17:58
Может это поможет тебе, но простой тоже может сработать
YCF_L 29.08.2018 17:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
81
4

Ответы 4

Вы можете разделить по предикату (например, совпадающему со строками в регулярном выражении):

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 - это список имен (не соответствующих шаблону номеров).

Итак, предположим, что у вас есть список, как показано ниже, вы можете перебирать и разделять элементы string и int путем сопоставления с регулярным выражением:

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

Если вы уверены, что идентификатор всегда начинается с цифры, а имена не начинаются с цифр, вы можете попробовать это.

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());
    }
}

Если вы хотите получить шестой элемент,

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

вывод будет,

123457
Jack

Ответ зависит от того, есть ли конкретный подход, который вы должны использовать для решения этого упражнения.

Если вы должны использовать массив, вам нужно научиться определять, является ли индексный номер массива конкретного элемента четным или нечетным, чтобы вы могли направить соответствующий элемент в один из других массивов. Посмотрите на оператор модуля.

Если вы должны использовать строку, а формат списка такой же, как вы ее написали, то вам нужно подумать о том, какие символы вы можете использовать, чтобы сначала разбить список на пары, а затем разбить эти пары на отдельные элементы, которые вы затем добавляете в соответствующие списки.

В том маловероятном случае, если вы должны использовать «Список», тогда метод для массивов, описанный выше, будет работать, но, исходя из сложности вопроса, я предполагаю, что списки появятся позже.

Другие вопросы по теме