Я пытаюсь создать общую функцию, которая строит список любого типа на основе строки, которая содержит значения этого типа, разделенные запятой. Я сделал это:Создайте список <T> из строки
public static <T> List<T> stringToList(String listStr, Class<T> itemType)
{
return Arrays.asList(listStr.split(",")).stream().map(x -> itemType.cast(x.replaceAll("\\s+|\"|\t","")))).collect(Collectors.toList());
}
Когда я пытаюсь проверить его:
String listStringsStr = "\"Foo\", \"Bar\"";
List<String> resS = stringToList(listStringsStr, String.class);
String listIntegersStr = "1,10,-1,0";
List<Integer> resI = stringToList(listStringsStr, Integer.class);
У меня есть две проблемы.
- В первом случае (String) я получаю дополнительную двойную кавычку вокруг каждой строки: "" Foo "", "Bar".
- Во втором случае (целое число) я получаю
java.lang.ClassCastException: Cannot cast java.lang.String to java.lang.Integer
, что означает, что он не может преобразовать «1» в 1. Я знаю, что это работает сInteger::parseInt
, но я хочу сделать общий метод.
Любые идеи?
[EDIT] - Потому что я вызвал замешательство, как я отправил это, я добавляю тестовый код:
String listStringsStr = "\"Foo\", \"Bar\"";
List<String> listStrings = Arrays.asList("Foo", "Bar");
String listIntegersStr = "1,10,-1,0";
List<Integer> listIntegers = Arrays.asList(1, 10, -1, 0);
List<String> resS = stringToList(listStringsStr, String.class);
System.out.println(resS);
System.out.println(listStrings);
assert (resS.containsAll(listStrings));
List<Integer> resI = stringToList(listIntegersStr, Integer.class);
System.out.println(resI);
System.out.println(listIntegers);
assert (resI.containsAll(listIntegers));
После включения x.replaceAll("\\s+|\"|\t","")
первое утверждение теперь пройти, второй не может. Выход консоли
[Foo, Bar]
[Foo, Bar]
[1, 10, -1, 0]
[1, 10, -1, 0]
listIntegers держит Integer, таким образом, я полагаю, RESI держит Интс, или я просто сломал типобезопасность в Java: D
Нет, у вас нет дополнительных кавычек. Единственные кавычки, которые у вас есть, это те, которые находятся в строке. Печать resS показывает 'resS = [" Foo "," Bar "]'. –
У меня есть. Когда вы печатаете строку в консоли, кавычки удаляются: Список listStrings = Arrays.asList («Foo», «Bar»); assert (resS.containsAll (listStrings)); вызывает исключение, показывающее, что listStrings содержат ["Foo", "Bar"], где resS содержит ["" Foo "", "Bar" "]. Если вы печатаете listStrings, вы не увидите никаких котировок –
chefarov
@chefarov Если ваше определение таково, что значения разделены запятой и ничего больше, то кавычки являются * частью * значения. Это даже включает в себя ведущее пространство перед «Бар». Если вы хотите использовать кавычки для того, чтобы значение содержало запятые, вам нужен CSV Parser, а не простой 'split()', поскольку это синтаксис CSV, который больше, чем просто разделение запятой. – Andreas