2013-09-26 4 views
1

문자열 목록이 있고 목록의 각 문자열 앞에 텍스트를 추가하고 싶습니다. 한 줄의 코드처럼 for/Iterator 루프없이이 작업을 수행하려고합니다. 나는 이것에 대한 해결책을 찾을 수 없다.자바 문자열 목록에 재귀 적으로 문자열 추가

다음은 for 루프를 사용했지만 다음과 같은 해결책이 필요합니다. 해결책이 있습니까?

List<String> strings = new ArrayList<String>(); 
       strings.add("a"); 
       strings.add("b"); 
       strings.add("c"); 
      strings.add("d"); 

List<String> appendedList = new ArrayList<String>(); 
for (String s : strings) { 
    appendedList.add("D" + s); 
} 

도와주세요. 감사. 이 같은

+6

왜? 있다면, 그것은 훨씬 덜 읽기 쉬울 것입니다. – Doorknob

+0

당신이 제안한 기술이 대부분의 목적에 유용하지는 않습니다. 왜 이렇게하고 싶은지 설명해 주시겠습니까? 이 숙제가 있니? – Jeremy

+0

아니 숙제가 아니지만 제 동료 중 한 명이 이것이 가능한지 알고 싶어합니다. appendList = StringUtils.append ("x", strings) – Sara

답변

4

은, 당신이 할 새로 추가 된 replaceAll 방법을 사용할 수 있습니다 전체 작업 예 :

import java.util.Arrays; 
import java.util.List; 

public class StringTest { 
    public static void main(String[] args) { 
    List<String> strings = Arrays.asList("a", "b", "c", "d"); 
    strings.replaceAll(s -> "D"+s); 
    System.out.println(strings); 
    } 
} 

또한 (업데이트) 목록의 복사본을 만드는 대신 돌연변이, 조금 더 자세하게이 작업을 수행하는 새로운 스트림 API를 사용하지만, 수 원래 목록 :

List<String> strings = Arrays.asList("a", "b", "c", "d"); 
strings = strings.stream() 
       .map(s -> "D"+s) // Using Lambda notation to update the entries 
       .collect(Collectors.toList()); 
System.out.println(strings); 

목록을 더 간결하게 작성하려면 Arrays.asList()을 사용했습니다. 이것은 Java 8의 새로운 기능이 아니므로 Java 5/6/7에서도 사용할 수 있어야합니다. 여기 내 출력입니다 :

$ java StringTest 
[Da, Db, Dc, Dd] 

심지어 당신이 지금 자바 (8)를 사용하지 않는, 그것은 이러한 기능이 추가 된 점에 유의 여전히 좋은, 그리고 1 년이나 2 년 정도 비슷한 문제로 실행하면 다음 만약 당신이 새로운 API의 무언가를 사용할 수 있습니다!

+0

이 솔루션을 가져올 것입니다,에 실행 속도의 조건? – seinecle

+0

@seinecle - 내부적으로 일종의 루프로 구현되었다고 생각 하겠지만 반복 (람다) 당 적어도 하나의 추가 함수 호출을 추가 할 것이므로 더 느릴 것이라고 생각합니다. 그러나 핫스팟 컴파일러가 람다를 인라인하는 것이 얼마나 좋은지 잘 모르겠습니다. 코드의 중요한 영역에 있으면 루프를 사용하여 유사한 머신 코드로 컴파일 될 수 있습니다. – DaoWen

2

뭔가 아마도

public List<String> recursiveAdd(List<String> strings, List<String> finalList, String prepender){ 
    if(strings == null || strings.size() == 0) return finalList; 
    else{ 
     finalList.add(prepender + strings.remove(0)); 
     return recursiveAdd(strings,finalList,prepender); 
    } 
} 

strings = recursiveAdd(strings, new ArrayList<String>(), "D"); 

이 기능 솔루션 더, 위의 코드의 문제는 문자열이 재귀를 호출하기 전에 깊은 복사본을 만들 수있는 클래스 내에서 파괴 될 것입니다 당신이 그것을 피하고 싶다면!

+0

이것은 반복을 피하기 위해 좋은 CompSci 응답입니다 - 재귀로 바꿉니다! 그러나 실제로 데이터를 변환하는 것을 잊었습니다. –

+0

죄송합니다. 코드를 편집했습니다! –

+0

당신은 또한 ("D"+ _)이 strings.asScala.map처럼 쉽게 스칼라에서이 작업을 수행 할 수 있습니다. asJava 당신은 루프보다 빨리 scala.collection.JavaConverters._ –

0

Google 구아바와 같은 라이브러리를 사용하여 '기능 스타일'버전을 작성할 수 있습니다. 그러나 이것은 일반적으로 단순한 루핑보다 선호도가 낮고 명확한 것으로 간주됩니다.

List<String> results = Lists.transform(inputs, new Function<String,String() { 
    public String apply (String input) { 
     return "D"+input; 
    } 
}; 

이것은 구글 구아바 코딩하지만, 아파치는 또한 '기능'스타일 라이브러리가있다.

실제로 문자열에 공통 접두어를 붙이는이 용도는별로 좋지 않습니다. 사용자는 모든 항목에 중복 된 접두어를 표시하는 데 관심이 없습니다. UI에서 접두어는 헤더에 한 번 표시해야합니다.

1

먼저 생각 : LINQ는 :)

자바에 대한 LINQ 대안의 몇있는 것으로 보인다 (참조 : Is there a Java equivalent for LINQ?What is the Java equivalent for LINQ?)를 작업하는 뭔가를 찾을 운이있을 경우.

내가 (테스트하지) 작동 할 수 있습니다 몇 가지 예를 제공합니다 :

LambdaJ

LambdaJ의 변환 기능을 사용하여, I는 다음과 같이 작동합니다 같아요

List<String> res = extract(strings, on(String.class).toString() + "D"); 

JPropel 빛

github에 있습니다.제공된 샘플을 바탕으로이 같은 일이 잘 작동 될 수 있습니다

strings.replaceAll(s -> "D"+s); 

은 다음과 같습니다 자바 (8)을 사용하는 경우

List<String> res = strings.select(append("D")).toList(); 
관련 문제