2016-07-10 2 views
-1

이 클래스에는 String 및 Arraylist를 인수로 취하는 생성자가 있습니다.ArrayList의 각 요소에 대해 toString을 가져 오는 방법은 무엇입니까?

class Foo{ 
    String ide; 
    ArrayList list; 

    public TypeOperator(String ide, ArrayList list){ 
     this.ide = ide; 
     this.list = list; 
    } 
} 

그래서 클래스 아래와 같이 초기화 할 때 :

SomeType 2 -> SomeType 1 

것은 이제 나는 SomeType 클래스가 있다고 가정 해 봅시다 :

ArrayList<SomeType> list = new ArrayList<Some Type>; 
list.add(SomeType1); 
list.add(SomeType2); 
Foo one = new Foo("->", list); 

아래와 같은 형식을 인쇄 할 수있는 방법이있다. SomeType 클래스에서 할 일이 있습니까?

+0

여기서 무엇을하고 싶은지 확실하지 않습니다. 배열의 모든 요소를 ​​반복하고 toString() 값을 출력하고 싶습니까? –

+1

값을 반복하여 Foo.toString()을 작성하거나 ArrayList의 toString을 재정의 하시겠습니까? 다음을보십시오 : http://stackoverflow.com/questions/18129505/how-can-i-override-the-tostring-method-of-an-arraylist-in-java –

답변

0

Foo 클래스에서 toElementString 메서드를 만들어야합니다.

public String toElementString(){ 
     if(list == null || list.size() == 0) return ""; 
     StringBuffer buffer = new StringBuffer(); 
     int size = list.size(); 
     for(int i = 0; i < size;i++){ 
      buffer.append(list.get(i)); 
      if(i != (size - 1)){ 
       buffer.append(" "); 
       buffer.append(ide); 
       buffer.append(" "); 
      } 
     } 
     System.out.println(buffer.toString()); 
     return buffer.toString(); 
    } 
+0

빈 목록은 특별한 경우가 아닙니다. 그것은 결코 루프에 들어 가지 않을 것입니다. 또한 'StringBuider'는 비 동시 사용을 위해'StringBuffer'보다 선호됩니다. 마지막으로, 문자열의 마지막에 구분자가 오게됩니다 ('item1 sep item2 sep item3 sep'와 같은 것) – Dici

1

우선 원시 타입을 사용하지 않는 것이 좋습니다. List은 제네릭 형식이므로 제네릭 형식으로 사용해야합니다.

그런 다음 수행하려는 작업은 에 불과합니다. 자바 (8)를 사용하는 경우, 당신은 당신이 좋아하는 일을 할 것이다 푸에서 toString() 메서드를 구현해야

StringBuilder sb = new StringBuilder(); 
Iterator<T> it = list.iterator(); 

if (it.hasNext()) sb.append(it.next()); 
while (it.hasNext()) { 
    sb.append(" -> ").append(it.next()); 
} 
String result = sb.toString(); 
1

할 수있는 평범하고 오래된 자바에서는

list.stream().collect(Collectors.joining(" -> ")) 

을 수행 할 수 있습니다

더 나은 공연
public String toString(){ 
    String result = "" ; 
    for(int i = list.size()-1;i>0;i--){ 
     result = result+ list.get(i).toString() + " " + ide + " "; 
    } 
    result = result + list.get(0).toString(); 
    return result; 
} 

또는, DICI가 지적했듯이 :

public String toString(){ 


    StringBuilder result = new StringBuilder() ; 
    if (!list.isEmpty()){ 
     for(int i = list.size()-1;i>0;i--){ 
      result.append(list.get(i).toString()).append(" ").append(ide).append(" "); 
     } 
     result.append(list.get(0).toString()); 
    } 
    return result.toString(); 
} 

그러면 SomeType을 표시하는 방법에 따라 고유 한 toString 메서드를 구현해야 할 것입니다.

+0

반복적으로 결과를 집계 할 때 문자열 연결이 느립니다. 'StringBuilder'는 훨씬 빠릅니다. 또한 빈 목록에 대한 코드가 실패합니다 – Dici

+0

자바 컴파일러가 성능을 향상 시키면 + 연산자에서 StringBuilder 로의 변환을 처리하는 데 시간이 걸렸습니다. http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.18.1. 예 빈 목록의 경우이 코드가 실패합니다. 그래서 내가 "~ 같이 될 것"이라고 말했다.) – minioim

+0

좋은 코드를 작성하기 위해 컴파일러에 의존해서는 안된다. 게다가, 당신은 틀렸어. 컴파일러는 단일 표현식에서'a + b + c'를 최적화하지만 다중 재 할당이있는 연속적인 명령문에서는 최적화되지 않습니다 (구현에 따라 다르다). 나는 당신에게 그것을 증명할 스 니펫을 만들 것입니다 – Dici

관련 문제