2010-06-21 2 views
2

2 개의 Properties 개체가 있다고 가정합니다. 하나는 마스터 속성을 포함하고 다른 하나는 대상입니다. 당신의 임무는이 둘을 비교하는 것입니다.속성 비교 질문

masterValue = masterProperties.getProperty(masterKey); 


for (Properties targetFileProperty : targetFileList) { 
    if (targetFileProperty.containsKey(masterKey)) { 
    targetValue = targetFileProperty.getProperty(masterKey); 

    if (masterValue.equals(targetValue)) { //<---- this is where the problem is 
     // do something clever 
    } else { 
     // do something clever 

제가 본 실시 예에서 대면하고 문제점이있다 :

마스터 키는 "A"이고, 마스터 값이 "10"이고, 목표 키 "A"및 10 "목표 키는"인

"위의 코드는 이들이 동일하다고 생각합니다. 즉, 공백을 없애거나 무시하는 것입니다.

내 논리에서 오류를 지적하거나 더 나은 방법으로 공백을 사용할 수 없다고 주장 할 수 있습니까? 무시해 주시겠습니까? 감사합니다.

답변

5

java.util.Properties in herits의 Map equality 구현 Hashtable에서 equals(Object) :

가이 맵과 동일한 지 어떤지 지정된 객체를 비교합니다. 주어진 객체가지도이고 두 개의지도가 동일한 매핑을 나타내는 경우 true을 반환합니다. 보다 공식적으로 두 개의 맵 m1m2m1.entrySet().equals(m2.entrySet()) 인 경우 동일한 맵핑을 나타냅니다. 이렇게하면 Map 인터페이스의 다른 구현에서 equals 메서드가 제대로 작동합니다. 두 Properties가 같은 키와 값을 포함하는 경우 비교하려는 경우

그래서, 당신은 단지 props1.equals(props2) 할 수 있습니다.

귀하의 문제에 관해서는, 나는 귀하가 실제 문제를 확인했다고 생각하지 않습니다. " 10 ".equals("10")은 확실히 false입니다. 문제는 문자열이 Properties에 값으로 입력되기 전에 다듬어 졌기 때문일 수 있습니다. 실제로 비교할 값을 인쇄 할 수 있습니다.

공백이 중요한 경우 속성 파일에서 이스케이프 처리해야합니다.

Properties p = new Properties(); 
    p.put("X", " "); 
    p.store(System.out, "test"); 

이 인쇄 (나는 명확성을위한 공간을 _를 대체 한) : 다음 getProperty에() 메소드 공백을 사용하여 속성을 읽을 때

#test 
#Mon Jun 21 22:20:04 ICT 2010 
X=\___ 
1

하는 것은 무시되고 여기에 어떻게하는지 보여주기 위해 조각이다 . 이것은 설명 할 수 있습니다 :

공백 문자 만 포함하는 자연 라인은 공백으로 간주되어 무시됩니다. 주석 줄에는 ASCII '#'또는 '!'가 있습니다. 첫 번째 비 공백 문자로; 주석 행은 무시되며 키 요소 정보를 인코딩하지 않습니다. 줄 종결 자 외에도이 메서드는 공백 ('', '\ u0020'), 탭 ('\ t', '\ u0009') 및 양식 공급 ('\ f', '\ u000C')을 다음과 같이 간주합니다. 공백이있다.

This page has more details.

중요한 경우 속성 파일에서 앞뒤 공백을 이스케이프 처리해야 할 수 있습니다.

0

String을 반환 getProperty 방법은 내가 무슨 일이 일어나고 것은 그것이 Properties지도에 추가되는 경우 속성 값이 트리밍되어 있다고 생각

masterValue.equals(targetValue) 

에 숨겨진 어떤주의가 안입니다.

targetFileProperty.getProperty("A")을 호출하여 확인한 값이 " 10 "이고 "10"이 아니라고 확인 했습니까? 이 "10"을인지이 있습니다 .. setProperty(String key, String value)가 손질 구현을 가지고 있지만 난 그냥 그것을 확인하고 그래서 당신의 문제가되지 않습니다

public synchronized Object setProperty(String key, String value) { 
    return put(key, value); 
} 

로 정의되어 있음을 의미하기 때문에

당신은 문자열 당신이 확실하다 다른 속성을 가하는 것은 다르다? 이것은 사소한 것처럼 들릴지 모르지만 나는 쉬운 설명을 볼 수 없다 ..