programing

목록 변환

copysource 2021. 1. 16. 20:39
반응형

목록 변환 목록에 직접


내 파일 "s"를 구문 분석 한 후 AttributeGet:1,16,10106,10111

따라서 attributeIDGet 목록에서 콜론 뒤의 모든 숫자를 가져와야합니다. 몇 가지 방법이 있다는 것을 알고 있습니다. 그러나 우리가 할 수있는 모든 방법은 직접 변환 List<String>에가 List<Integer>. 아래 코드는 유형 불일치에 대해 불평하므로 Integer.parseInt를 시도했지만 List에서는 작동하지 않을 것 같습니다. 여기는 String입니다.

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

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

아니요, 배열을 반복해야합니다.

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

Java8 사용 :

stringList.stream().map(Integer::parseInt).collect(Collectors.toList());

람다 사용 :

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


Guava 변환기 가 트릭을 수행합니다.

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

아니요, 각 요소를 반복해야합니다.

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

이런 일이 발생하는 이유는에 한 종류의 목록을 변환 할 간단한 방법이 없다는 것입니다 다른 유형입니다. 일부 변환은 불가능하거나 특정 방식으로 수행해야합니다. 본질적으로 변환은 관련된 개체와 변환의 컨텍스트에 따라 달라 지므로 "하나의 크기에 모두 적용되는"솔루션은 없습니다. 예를 들어, Car물건과 물건 이 있다면 Person어떨까요? 실제로 의미가 없기 때문에 a List<Car>를로 List<Person>직접 변환 할 수 없습니다 .


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);
            };
        });
    }

네, 위의 답변에 동의합니다. 그러나 그것은 다른 방법 일뿐입니다.


스트림을 사용하여 문자열 목록을 정수 목록으로 변환하지 않는 이유는 무엇입니까? 아래와 같이

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

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

아니요, Java에서 수행 할 수있는 방법은 없습니다 (내가 알고있는).

기본적으로 각 항목을 문자열에서 정수로 변환해야합니다.

원하는 것은보다 기능적인 언어로 달성 할 수 있습니다. 여기서 변형 함수를 전달하고 목록의 모든 요소에 적용 할 수 있습니다 ...하지만 가능하지 않습니다 (목록의 모든 요소에 여전히 적용됩니다). ).

지나침:

You can, however use a Function from Google Guava (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html) to simulate a more functional approach, if that is what you're looking for.

If you're worried about iterating over the list twice, then instead of split use a Tokenizer and transform each integer token to Integer before adding to the list.


Here is another example to show power of Guava. Although, this is not the way I write code, I wanted to pack it all together to show what kind of functional programming Guava provides for 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>();

You can consider code in my repo.

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

castStringCollection(Collection<T>,Class)


Using Streams and Lambda:

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

The above line of code will convert the List of type List<String> to List<Integer>.

I hope it was helpful.

ReferenceURL : https://stackoverflow.com/questions/10706721/convert-liststring-to-listinteger-directly

반응형