解析我的文件后,“s”包含AttributeGet:1,16,10106,10111
所以我需要在attributeIDGet List中获取冒号后面的所有数字。我知道有几种方法可以做到这一点。但是我们有什么方法可以直接将List<String>
转换为List<Integer>
。
由于下面的代码抱怨类型不匹配,所以我尝试做Integer.parseInt,但我想这对List不起作用。这里是字符串。
private static List<Integer> attributeIDGet = new ArrayList<Integer>();
if(s.contains("AttributeGet:")) {
attributeIDGet = Arrays.asList(s.split(":")[1].split(","));
}
答案 0 :(得分:61)
不,你需要遍历数组
for(String s : strList) intList.add(Integer.valueOf(s));
答案 1 :(得分:46)
使用Java8:
stringList.stream().map(Integer::parseInt).collect(Collectors.toList());
答案 2 :(得分:9)
Guava Converters这样做。
import com.google.common.base.Splitter;
import com.google.common.primitives.Longs;
final Iterable<Long> longIds =
Longs.stringConverter().convertAll(
Splitter.on(',').trimResults().omitEmptyStrings()
.splitToList("1,2,3"));
答案 3 :(得分:9)
使用lambda:
strList.stream().map(org.apache.commons.lang3.math.NumberUtils::toInt).collect(Collectors.toList());
答案 4 :(得分:8)
不,你必须遍历每个元素:
for(String number : numbers) {
numberList.add(Integer.parseInt(number));
}
发生这种情况的原因是没有直接的方法将一种类型的列表转换为任何其他类型。有些转换是不可能的,或者需要以特定方式完成。本质上,转换取决于所涉及的对象和转换的上下文,因此没有“一刀切”的解决方案。例如,如果您有一个Car
对象和一个Person
对象,该怎么办?您无法直接将List<Car>
转换为List<Person>
,因为它实际上没有意义。
答案 5 :(得分:7)
如果您使用Google Guava library,则可以执行此操作,请参阅Lists#transform
String s = "AttributeGet:1,16,10106,10111";
List<Integer> attributeIDGet = new ArrayList<Integer>();
if(s.contains("AttributeGet:")) {
List<String> attributeIDGetS = Arrays.asList(s.split(":")[1].split(","));
attributeIDGet =
Lists.transform(attributeIDGetS, new Function<String, Integer>() {
public Integer apply(String e) {
return Integer.parseInt(e);
};
});
}
是的,同意上面的答案,它是臃肿,但很时尚。但这只是另一种方式。
答案 6 :(得分:4)
为什么不使用流将字符串列表转换为整数列表? 如下所示
List<String> stringList = new ArrayList<String>(Arrays.asList("10", "30", "40",
"50", "60", "70"));
List<Integer> integerList = stringList.stream()
.map(Integer::valueOf).collect(Collectors.toList());
完整的操作可能是这样的
String s = "AttributeGet:1,16,10106,10111";
List<Integer> integerList = (s.startsWith("AttributeGet:")) ?
Arrays.asList(s.replace("AttributeGet:", "").split(","))
.stream().map(Integer::valueOf).collect(Collectors.toList())
: new ArrayList<Integer>();
答案 7 :(得分:3)
如果允许您使用Java 8中的lambdas,则可以使用以下代码示例。
final String text = "1:2:3:4:5";
final List<Integer> list = Arrays.asList(text.split(":")).stream()
.map(s -> Integer.parseInt(s))
.collect(Collectors.toList());
System.out.println(list);
不使用外部库。简单旧新Java!
答案 8 :(得分:2)
您可以使用Java 8的Lambda函数实现此目的,而无需循环
String string = "1, 2, 3, 4";
List<Integer> list = Arrays.asList(string.split(",")).stream().map(s -> Integer.parseInt(s.trim())).collect(Collectors.toList());
答案 9 :(得分:1)
不,我没有办法(我知道)在Java中这样做。
基本上你必须将每个条目从String转换为Integer。
你正在寻找的东西可以用更多功能的语言来实现,你可以传递一个转换函数并将它应用到列表的每个元素......但是这样做是不可能的(它仍然适用于每个元素)在列表中。)
<强>过度破坏:强>
但是,您可以使用Google Guava中的函数(http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html)来模拟更具功能性的方法,如果那就是你要找的东西。
如果您担心迭代列表两次,那么在添加到列表之前,使用Tokenizer并将每个整数标记转换为Integer,而不是拆分。
答案 10 :(得分:0)
这是另一个展示番石榴力量的例子。虽然这不是我编写代码的方式,但我想将它们打包在一起,以展示Guava为Java提供的函数式编程。
Function<String, Integer> strToInt=new Function<String, Integer>() {
public Integer apply(String e) {
return Integer.parseInt(e);
}
};
String s = "AttributeGet:1,16,10106,10111";
List<Integer> attributeIDGet =(s.contains("AttributeGet:"))?
FluentIterable
.from(Iterables.skip(Splitter.on(CharMatcher.anyOf(";,")).split(s)), 1))
.transform(strToInt)
.toImmutableList():
new ArrayList<Integer>();
答案 11 :(得分:0)
您可以在我的仓库中考虑代码。
https://github.com/mohamedanees6/JavaUtils/wiki/CollectionUtils
castStringCollection(Collection<T>,Class)
答案 12 :(得分:0)
使用Streams和Lambda:
newIntegerlist = listName.stream().map(x->
Integer.valueOf(x)).collect(Collectors.toList());
上面的代码行会将List<String>
类型的列表转换为List<Integer>
。
我希望这会有所帮助。
答案 13 :(得分:0)
使用如下所示的Guava变换方法,
List intList = Lists.transform(stringList,Integer :: parseInt);
答案 14 :(得分:0)
导入 java.util.Arrays; 导入 java.util.Scanner;
公开课 reto1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double suma = 0, promedio = 0;
String IRCA = "";
int long_vector = Integer.parseInt(input.nextLine());
int[] Lista_Entero = new int[long_vector]; // INSTANCE INTEGER LIST
String[] lista_string = new String[long_vector]; // INSTANCE STRING LIST
Double[] lista_double = new Double[long_vector];
lista_string = input.nextLine().split(" "); // INPUT STRING LIST
input.close();
for (int i = 0; i < long_vector; i++) {
Lista_Entero[i] = Integer.parseInt(lista_string[i]); // CONVERT INDEX TO INDEX FROM STRING UNTIL INTEGER AND ASSIGNED TO NEW INTEGER LIST
suma = suma + Lista_Entero[i];
}