2011-12-11 2 views
1

항공기화물을 모델링하는 클래스를 코딩 중이므로 클래스의 toString() 메서드를 포맷하는 데 문제가 있습니다. 다음 코드 :문자열 서식 지정

public class Cargo 
{ 
    private String label; 
    private int weight, height, width, length; 

    public String toString() 
    { 
     return String.format("%s%s\t\t%-7s%-2s%-5d%-11s%-2s%-3d%-2s%-3d%-2s%d", 
       getLabel(), ":", "Weight", "=", getWeight(), "Dimensions", 
       "=", getHeight(), "X", getWidth(), "X", getLength()); 
    } 

    public static void main(String[] args) 
    { 
     Cargo cargo1 = new Cargo("Bill's Beans", 1200, 20, 15, 30); 
     Cargo cargo6 = new Cargo("Chicago Bulls", 1000, 10, 10, 10); 
     Cargo cargo7 = new Cargo("Lots of Meat", 3000, 20, 20, 20); 
     Cargo cargo8 = new Cargo("Tammy's Tomatoes", 600, 6, 6, 6); 

     System.out.println(cargo1.toString()); 
     System.out.println(cargo6.toString()); 
     System.out.println(cargo7.toString()); 
     System.out.println(cargo8.toString()); 
    } 
} 

이 출력을 생성합니다 ". 태미의 토마토"

Bill's Beans:  Weight = 1200 Dimensions = 20 X 15 X 30 
Chicago Bulls:  Weight = 1000 Dimensions = 10 X 10 X 10 
Lots of Meat:  Weight = 3000 Dimensions = 20 X 20 X 20 
Tammy's Tomatoes:  Weight = 600 Dimensions = 6 X 6 X 6 

당신이 볼 수 있듯이이 모든 것을 제외하고, 잘 정렬을 이 문제를 어떻게 해결할 수 있습니까? 감사.

+0

% s % s 이후에 추가 탭이 나타날 수 있습니다. – Bhushan

답변

5

탭을 사용하기 때문에 "Tammy 's Tomatoes"를 제외한 모든 항목이 잘 정렬됩니다. 이 경우 탭의 길이는 4 자입니다. "빌의 콩 :"반면 : 14이며, 13 자, "시카고 불스가" "고기를 많이", 13 "태미의 토마토 :"17

13/4 = 3 
14/4 = 3 
13/4 = 3 
17/4 = 4 

또는 적어도 그 프로그래머가 생각하는 무엇이다 ;)

그래서 마지막 탭에 다른 탭을 놓으면 나머지는 4 문자를 시작합니다.

회사 이름에 몇 개의 문자가 있는지에 따라 탭 수를 조정하여이 문제를 해결할 수 있습니다.

치수가 4 공백의 7 번째 세트에서 시작한다고 가정 해보십시오.

먼저 이름이 차지할 공간의 양을 계산하십시오. 4로 나눕니다 (위와 동일).

숫자를 뺍니다. 그래서 Tammy의 토마토는 7-4=3입니다. 3 "\ t"을 결과에 추가하는 루프를 실행하십시오 (추가 할 위치).

그래서 결국, 당신의 코드는 다음과 같습니다 코멘트에서 질문에 대답하는

String result = String.format("%s%s", getLabel(), ":"); 

    int tabs = result.length()/4; 
    int desiredTabs = 7; 
    for(int i = 0; i < desiredTabs-tabs) { 
     result += "\t"; 
    } 
    result += String.format("%-7s%-2s%-5d%-11s%-2s%-3d%-2s%-3d%-2s%d", 
      "Weight", "=", getWeight(), "Dimensions", 
      "=", getHeight(), "X", getWidth(), "X", getLength()); 
    return result; 

편집 :

글쎄, 당신은 정말 String.format()를 사용할 필요가 없습니다. 실제로 변수를 추가 할 수 있습니다 (예 : result + getWidth()). 그게 당신이 사용했기 때문에 그냥 String.format()을 사용했습니다. 당신은 그것을 다시 작성할 수 :

String result = String.format("%s%s", getLabel(), ":"); 

    int tabs = result.length()/4; 
    int desiredTabs = 7; 
    for(int i = 0; i < desiredTabs-tabs) { 
     result += "\t"; 
    } 
    result += "Weight = " + getWeight() + " Dimensions = " + getHeight() + " X " + getWidth() + " X " + getLength(); 

    return result; 

훨씬 간단

는 :

+0

도움을 주셔서 감사합니다. 프로그램에 연결했는데 마치 매력처럼 작동했습니다! :) BTW, 왜 자바가이 겉보기에 쉬운 일을 그렇게 복잡하게 만들었는지 아십니까? – LTH

+0

귀하의 의견에 대한 답변을 편집했습니다. 내가 도울 수 있다면 나는 String.format()을 사용하지 않는다! – eboix

2

사실은 멀리 탭에서 머물 추천 할 것입니다. 다른 탭 설정이있는 곳으로 프로그램을 출력하는 상황이있을 수 있으며, 출력을 정렬하는 탭에 따라 이미 수행 한 이유와 정확히 일치하는 일반적인 경우에 현혹적인 전망이 될 수 있습니다. - 일을 정렬하는 것은 데이터와 분리하려는 데이터의 길이를 아는 것 (또는 계산)에 달려 있습니다. 귀하의 경우, 28 자 이상의 레이블로 끝나면 계산이 실패하게됩니다.

왜 탭을 사용하는 대신 라벨 폭을 지정하기 위해 필드의 폭 플래그를 사용하지 않는 것이 좋을까요?

제안서와 별도로 형식 문자열을 더 쉽게 읽을 수 있습니다.이 단지에 포함 된 상수가있는 경우) : 이제

String formatString = "%17s: Weight = %-5d Dimensions = %-2d X %-2d X %-2d"; 
String result = String.format(formatString, getWeight(), getHeight(), getWidth(), getLength()); 

을 나는 문자열을 볼 때 내가 데이터를 가하고있어 전반적인 결과가 어떻게 보일까 어디에 나를 말할를 들어, 대신, 쉽게 형식 문자열과 상수를 일치시키려는 시도.

어쨌든, 그것은 대안입니다.

+0

더 깊은 반성에, 나는 이것이 행동의 가장 현명한 코스일지도 모른다라고 생각한다. 감사! – LTH