web-dev-qa-db-ja.com

List <String>をList <Integer>に直接変換します

ファイル「s」を解析した後、AttributeGet:1,16,10106,10111

したがって、attributeIDGetリストのコロンの後にすべての数値を取得する必要があります。いくつかの方法があります。しかし、できる方法はありますか直接変換List<String>からList<Integer>以下のコードは型の不一致について文句を言うので、私はInteger.parseIntを実行しようとしましたが、これはリストでは機能しないと思います。ここでsは文字列です。

private static List<Integer> attributeIDGet = new ArrayList<Integer>();

if(s.contains("AttributeGet:")) {
    attributeIDGet = Arrays.asList(s.split(":")[1].split(","));
}
52
AKIWEB

いいえ、配列をループする必要があります

for(String s : strList) intList.add(Integer.valueOf(s));
62
Kevin

Java8の使用:

stringList.stream().map(Integer::parseInt).collect(Collectors.toList());
49
Dawid Stępień

ラムダを使用:

strList.stream().map(org.Apache.commons.lang3.math.NumberUtils::toInt).collect(Collectors.toList());

9
Tadeu Jr.

グアバコンバーター トリックを行います。

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"));
9

いいえ、各要素を反復処理する必要があります。

for(String number : numbers) {
   numberList.add(Integer.parseInt(number)); 
}

これが発生する理由は、あるタイプのリストをその他タイプに変換する簡単な方法がないためです。一部の変換は不可能であるか、特定の方法で実行する必要があります。基本的に、変換は関連するオブジェクトと変換のコンテキストに依存するため、「1つのサイズですべてに適合する」ソリューションはありません。たとえば、CarオブジェクトとPersonオブジェクトがある場合はどうでしょう。 List<Car>List<Person>に直接変換することはできません。実際には意味がありません。

8
Vivin Paliath

Google Guavaライブラリ を使用する場合は、これを行うことができます。 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);
            };
        });
    }

うん、肥大しているがスタイリッシュな上記の答えに同意する。しかし、それは別の方法です。

7
Nishant

なぜストリームを使用して文字列のリストを整数のリストに変換しないのですか?以下のような

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>();
4
Morteza Adi

Java 8のラムダを使用できる場合は、次のコードサンプルを使用できます。

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!

3
javatarz

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());
2
virag

いいえ、Javaでそれを行う方法(私が知っていること)はありません。

基本的に、各エントリを文字列から整数に変換する必要があります。

探しているものは、より機能的な言語で実現できます。変換関数を渡して、リストのすべての要素に適用できます。しかし、それは不可能です(リストのすべての要素に適用されます) )。

オーバーキル:

ただし、Google Guavaの関数(http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html)を使用して、より機能的なアプローチをシミュレートできます。あなたが探しているものです。

リストを2回反復することが心配な場合は、splitの代わりにTokenizerを使用して、リストに追加する前に各整数トークンをIntegerに変換します。

1
pcalcao

StreamsおよびLambdaの使用:

newIntegerlist = listName.stream().map(x-> 
    Integer.valueOf(x)).collect(Collectors.toList());

上記のコード行は、タイプList<String>のリストをList<Integer>に変換します。

お役に立てば幸いです。

0
Akash Anand

私のリポジトリでコードを検討できます。

https://github.com/mohamedanees6/JavaUtils/wiki/CollectionUtils

castStringCollection(Collection<T>,Class)

0
Mohamed Anees A

グアバの力を示す別の例です。これは私がコードを書く方法ではありませんが、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>();
0
husayt