목록을 목록 으로 변환
, 수수 、 정 i 、 。List<Integer>
Strings로 Strings로 List<String>
.
자연스럽게, 나는 새로운 것을 만들 수 있었다.List<String>
호출할 수 있습니다.String.valueOf()
더 나은 (읽기: 좀 더 자동적인) 방법이 없을까 해서요.
Guava-Project의 Google 컬렉션을 사용하면transform
Lists 클래스의 메서드
import com.google.common.collect.Lists;
import com.google.common.base.Functions
List<Integer> integers = Arrays.asList(1, 2, 3, 4);
List<String> strings = Lists.transform(integers, Functions.toStringFunction());
List
returned returned returned returned returned returned returned returned returnedtransform
는 백업목록의 뷰입니다.변환은 변환목록에 대한 각 접근에 적용됩니다.
「 」는 .Functions.toStringFunction()
NullPointerException
되는 경우 에 null. "null" "null" "null" "null" "null" "null" "null" "null" "null" "null" "null" "null" 이 포함되어 있지 않은 에만 사용합니다
Java 8용 솔루션Guava보다 조금 더 길지만 적어도 라이브러리를 설치할 필요는 없습니다.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
//...
List<Integer> integers = Arrays.asList(1, 2, 3, 4);
List<String> strings = integers.stream().map(Object::toString)
.collect(Collectors.toList());
Java 11의 경우,
List<String> strings = integers.stream().map(Object::toString)
.collect(Collectors.toUnmodifiableList());
없습니다.map
정??
내가 아는 한, 반복하고 인스턴스화하는 것만이 이것을 할 수 있는 유일한 방법이다.예를 들어 (다른 사람에게 도움을 줄 수 있는 경우, 이 방법을 알고 있을 것이기 때문에)
List<Integer> oldList = ...
/* Specify the size of the list up front to prevent resizing. */
List<String> newList = new ArrayList<>(oldList.size());
for (Integer myInt : oldList) {
newList.add(String.valueOf(myInt));
}
당신이 하고 있는 일은 괜찮지만, 만약 당신이 'Java-it-up'의 필요성을 느낀다면 트랜스포머와 Apache Commons의 수집 방법을 사용할 수 있다.
public class IntegerToStringTransformer implements Transformer<Integer, String> {
public String transform(final Integer i) {
return (i == null ? null : i.toString());
}
}
..그리고..
CollectionUtils.collect(
collectionOfIntegers,
new IntegerToStringTransformer(),
newCollectionOfStrings);
String.valueOf의 소스는 다음과 같습니다.
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
별로 중요하지 않지만, 저는 ToString을 사용하고 싶습니다.
String.valueOf를 사용하는 대신 .toString()을 사용합니다.이것에 의해, @johnathan에 의해서 기술된 자동 박스가 회피됩니다.홀랜드
javadoc은 valueOf가 Integer.toString()과 같은 것을 반환한다고 말합니다.
List<Integer> oldList = ...
List<String> newList = new ArrayList<String>(oldList.size());
for (Integer myInt : oldList) {
newList.add(myInt.toString());
}
다음은 JDK가 아닌 라이브러리에서 부정행위를 저지르지 않는 원라이너 솔루션입니다.
List<String> strings = Arrays.asList(list.toString().replaceAll("\\[(.*)\\]", "$1").split(", "));
Guava 및 Java 8을 사용한 다른 솔루션
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> strings = Lists.transform(numbers, number -> String.valueOf(number));
List<String> stringList = integerList.stream().map((Object s)->String.valueOf(s)).collect(Collectors.toList())
핵심 Java도 아니고 범용 라이브러리도 아니지만, 인기 있는 자카르타 공용 컬렉션 라이브러리에는 이러한 종류의 작업에 유용한 추상화가 몇 가지 있습니다.구체적으로는, 다음의 수집 방법을 봐 주세요.
프로젝트에서 이미 공용 컬렉션을 사용하고 있다면 고려해야 할 사항입니다.
Jsight의 답변에서 "복싱"에 대해 우려하는 사람들에게: 없습니다. String.valueOf(Object)
또, 를 해제하지 않습니다.int
공연된 적이 없습니다.
" " " 를 Integer.toString()
★★★★★★★★★★★★★★★★★」String.valueOf(Object)
생각할 수 있는 늘을 처리하는 방법에 따라 달라집니다.예외(아마도)를 발생시키거나 목록에 "null" 문자열을 포함하시겠습니까?요, 요?NullPointerException
니른른 른른 른른 른른 른? 른??
또한 jsight의 응답에 작은 결함이 하나 있습니다.List
인터페이스이므로 새로운 연산자를 사용할 수 없습니다.는 아마 는 a a를 이다.java.util.ArrayList
이 경우, 특히 리스트가 얼마나 길지 미리 알고 있기 때문에.
원래 목록의 forEach 메서드를 사용하여 조금 더 간결한 솔루션:
List<Integer> oldList = Arrays.asList(1, 2, 3, 4, 5);
List<String> newList = new ArrayList<>(oldList.size());
oldList.forEach(e -> newList.add(String.valueOf(e)));
@ Jonathan:틀릴 수도 있지만 이 경우 String.valueOf()는 String.valueOf(int)에 박스를 넣는 것이 아니라 String.valueOf(Object) 함수를 호출할 것이라고 생각합니다.String.valueOf(Object)는 null인 경우 "null"을 반환하고 null이 아닌 경우 Object.toString()을 호출합니다.이것은 박스를 수반하지 않습니다(단, 새로운 문자열 오브젝트의 인스턴스화에 관여하는 것은 명백합니다.
Object.toString()을 디버깅 이외의 목적으로 사용하는 것은 매우 나쁜 생각이라고 생각합니다.이 경우 두 가지 기능은 동일합니다(목록에 늘이 없는 경우).개발자는 경고 없이 표준 라이브러리의 모든 클래스의 toString() 메서드를 자유롭게 변경할 수 있습니다.
박싱/언박싱 프로세스로 인해 발생하는 성능 문제에 대해 걱정하지 마십시오.퍼포먼스가 중요한 경우는 어레이를 사용합니다.정말 중요한 경우에는 Java를 사용하지 마십시오.JVM을 앞지르려고 하면 마음이 아플 뿐입니다.
전문가만을 위한 답변:
List<Integer> ints = ...;
String all = new ArrayList<Integer>(ints).toString();
String[] split = all.substring(1, all.length()-1).split(", ");
List<String> strs = Arrays.asList(split);
Lambdaj는 매우 간단하고 읽기 쉬운 방법으로 그것을 가능하게 한다.예를 들어, Integer 목록이 있고 대응하는 String 표현으로 변환할 경우 다음과 같이 쓸 수 있습니다.
List<Integer> ints = asList(1, 2, 3, 4);
Iterator<String> stringIterator = convertIterator(ints, new Converter<Integer, String> {
public String convert(Integer i) { return Integer.toString(i); }
}
Lambdaj는 결과를 반복하는 동안에만 변환 함수를 적용합니다.
"상자 오버헤드"를 피할 수 없습니다. Java의 가짜 일반 컨테이너는 객체만 저장할 수 있으므로 int는 Integress로 구분해야 합니다.원칙적으로 오브젝트에서 정수로의 다운캐스트를 회피할 수 있지만(오브젝트는 String.valueOf와 Object.toString에 모두 적합하기 때문에 의미가 없기 때문에), 컴파일러가 충분히 스마트한지 모르겠습니다.String에서 Object로의 변환은 어느 정도 no-op이어야 하기 때문에 저는 그것에 대해 걱정하고 싶지 않습니다.
jsr166y fork-join 프레임워크를 사용한 솔루션은 JDK7에서 수행해야 합니다.
import java.util.concurrent.forkjoin.*;
private final ForkJoinExecutor executor = new ForkJoinPool();
...
List<Integer> ints = ...;
List<String> strs =
ParallelArray.create(ints.size(), Integer.class, executor)
.withMapping(new Ops.Op<Integer,String>() { public String op(Integer i) {
return String.valueOf(i);
}})
.all()
.asList();
(면책자:컴파일되지 않았습니다.사양이 확정되지 않았습니다.기타)
JDK7에는 없는 것 같습니다.유형추론과 구문설탕이 약간 포함되어 있기 때문에 Mapping call의 상세도가 낮아집니다.
.withMapping(#(Integer i) String.valueOf(i))
이것은 기본적인 작업이기 때문에 외부 라이브러리를 사용하지 않습니다(필요 없는 프로젝트에 의존하게 됩니다).
이러한 작업을 수행하기 위해 특별히 설계된 정적 메서드 클래스가 있습니다.이 코드는 매우 간단하기 때문에 Hotspot에서 최적화를 할 수 있습니다.이것은 최근 제 코드의 주제인 것 같습니다. 매우 간단한(직접) 코드를 작성하여 핫스팟이 마법을 부리게 하는 것입니다.이와 같은 코드의 퍼포먼스 문제는 거의 발생하지 않습니다.새로운 VM 버전이 출시되면 모든 추가 속도의 이점을 누릴 수 있습니다.
자카르타 컬렉션을 좋아하지만 Generics를 지원하지 않고 LCD로 1.4를 사용하고 있습니다.Google Collections는 Alpha 지원 레벨로 표시되므로 주의가 필요합니다.
나는 우주 복잡성의 원리를 따르는 어떤 해결책도 보지 못했다.정수 목록에 원소의 수가 많으면 큰 문제가 됩니다.
It will be really good to remove the integer from the List<Integer> and free
the space, once it's added to List<String>.
반복기를 사용하여 동일한 결과를 얻을 수 있습니다.
List<Integer> oldList = new ArrayList<>();
oldList.add(12);
oldList.add(14);
.......
.......
List<String> newList = new ArrayList<String>(oldList.size());
Iterator<Integer> itr = oldList.iterator();
while(itr.hasNext()){
newList.add(itr.next().toString());
itr.remove();
}
나는 단지 그 문제에 대한 객관적인 해결책에 동참하고 싶었다.
도메인 개체를 모델링하는 경우 솔루션은 도메인 개체에 있습니다.이 도메인은 문자열 값을 원하는 정수 목록입니다.
가장 쉬운 방법은 목록을 전혀 변환하지 않는 것입니다.
즉, 변환하지 않고 변환하려면 원래 Integer 목록을 List of Value로 변경합니다. 여기서 Value는 다음과 같습니다.
class Value {
Integer value;
public Integer getInt()
{
return value;
}
public String getString()
{
return String.valueOf(value);
}
}
이 방법은 목록을 복사하는 것보다 더 빠르고 메모리 사용량이 적습니다.
행운을 빕니다.
언급URL : https://stackoverflow.com/questions/18524/converting-listinteger-to-liststring
'programing' 카테고리의 다른 글
jar 파일을 실행하는 동안 매니페스트 기본 특성 예외에 대한 서명 파일 다이제스트가 잘못되었습니다. (0) | 2022.09.25 |
---|---|
MySQL에서 잠금을 유발하지 않고 선택할 수 있는 방법이 있습니까? (0) | 2022.09.25 |
SQL 구문. 올바른 구문은 MariaDB 서버 버전에 해당하는 매뉴얼을 참조하십시오. (0) | 2022.09.25 |
특정 테이블에서 왼쪽 조인 속도가 매우 느립니다. (0) | 2022.09.23 |
AssertEquals 2 리스트는 순서를 무시합니다. (0) | 2022.09.22 |