2013-11-13 4 views
3

У меня есть строка с запятой, которую я получаю от базы данных. Теперь я хочу передать эту целую строку в другой запрос, но требуемый тип данных длинный, и я хочу использовать в статье, чтобы это сделать.Преобразовать строку в список <Long>

str1 = [123,456,789]; 

Есть ли какой-либо прямой способ сделать это, а не зацикливание.

+0

Насколько мне известно, единственный способ обхвата. Я бы сохранил их в LinkedList для O (N * M), где M - длина каждого числа (стоимость преобразования строки в длину), а N - количество элементов –

+0

Можете ли вы показать запросы, которые вы пытаетесь запустить? Что такое РСУБД? – Mureinik

+1

Когда вы говорите «значение, разделенное запятыми», вы говорите о формате файла '.csv' или номерах, написанных для потребления человеком, с соглашением о запятых между каждой группой из трех цифр? –

ответ

4

С guava:

List<Long> longs = Lists.newArrayList(Iterables.transform(Splitter.on(',').split("1,2,3"), new Function<String, Long>() { 
    public Long apply(final String in) { 
     return in == null ? null : Longs.tryParse(in); 
    } 
})); 

EDIT:

С List<String> (stringList) в качестве входных данных:

List<Long> longs = Lists.newArrayList(Lists.transform(stringList, new Function<String, Long>() { 
    public Long apply(final String in) { 
     return in == null ? null : Longs.tryParse(in); 
    } 
})); 
+0

Спасибо за исправление @Robin Green;) –

+0

Привет, Робин, это дает мне NumberFormatException, когда я передаю строку.Actaully его Список , что я изменил на String из метода toString(). Или есть способ, которым я могу использовать список , чтобы перейти в Список ? – user2986404

+0

Отредактировано, чтобы показать, как это сделать, начиная с списка строк. –

0

вы можете попробовать ниже код, чтобы получить длинное значение из строки

если str1 = "123456789"

Long x=Long.parseLong(str1.replace(",","")); 

и

если str1 = "[123456789]"

Long x=Long.parseLong(str1.replace(",|\\[|\\]","")); 
+0

По-прежнему не работает, он будет вызывать исключение разбора –

+0

Да, если он используется для всей строки, но не для долгого использования. –

+2

@RobinGreen вопрос о строке, содержащей ',' и не как синтаксический анализ длинного –

2

Я сомневаюсь, что вы можете сделать это без зацикливания. Вот пример обходной путь:

String str = "[123,456,789]"; 


Pattern pattern = Pattern.compile("\\d+"); 
Matcher matcher = pattern.matcher(str); 

List<Long> list = new ArrayList<Long>(); 

while (matcher.find()) { 
System.out.println(matcher.group()); 
list.add(Long.parseLong(matcher.group())); // Add the value to the list 
} 
System.out.println(list); 
0

Использование string.replace при условии str1 содержит "[123123123]"

str1 = str1.replace(",|\\[|\\]",""); //should replace commas and brackets with nothing; 

, то вы должны быть в состоянии сделать

Long myLong = Long.parseLong(str1); 
+0

Я предполагаю, что вопросник означает значение, разделенное запятыми, в смысле формата файла .csv, а не в смысле числа, написанного для потребления человеком, запятыми между каждыми тремя цифрами, но вы можете быть правы! –

2

Используйте StringTokenizer и добавьте разделительные маркеры в список с циклом while.

StringTokenizer st = new StringTokenizer("1,2,3", ","); 
List<Long> list = new ArrayList<Long>(); 
while (st.hasMoreTokens()) 
{ 
    list.add(Long.valueOf(st.nextToken())); 
} 
2

Вы можете использовать функции Лямбда Java 8, чтобы достичь этой цели без зацикливания

String string = "1, 2, 3, 4"; 
    List<Long> list = Arrays.asList(string.split(",")).stream().map(s -> Long.parseLong(s.trim())).collect(Collectors.toList()); 
+0

Спасибо ... вот что я ищу ... – Cataclysm

Смежные вопросы