У меня есть список:
[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]
Как мне сделать это самым простым способом? Спасибо




Вы можете разделить по предикату (например, совпадающему со строками в регулярном выражении):
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
Ответ зависит от того, есть ли конкретный подход, который вы должны использовать для решения этого упражнения.
Если вы должны использовать массив, вам нужно научиться определять, является ли индексный номер массива конкретного элемента четным или нечетным, чтобы вы могли направить соответствующий элемент в один из других массивов. Посмотрите на оператор модуля.
Если вы должны использовать строку, а формат списка такой же, как вы ее написали, то вам нужно подумать о том, какие символы вы можете использовать, чтобы сначала разбить список на пары, а затем разбить эти пары на отдельные элементы, которые вы затем добавляете в соответствующие списки.
В том маловероятном случае, если вы должны использовать «Список», тогда метод для массивов, описанный выше, будет работать, но, исходя из сложности вопроса, я предполагаю, что списки появятся позже.
Вы можете получить все элементы с четным индексом (0, 2, 4 ...) и поместить все их в
id array, а элементы с нечетным индексом (1, 3, 5 ...) поместить вnames array