2010-12-26 2 views
0

그래서이 함수는 arraylist에게 문자열의 모든 순열을 추가하는 조합입니다.Java ArrayList 문제 (valueOf() 포함)

public static void combinations(String prefix, String s, ArrayList PermAttr) { 
     if (s.length() > 0) { 
      PermAttr.add(prefix + s.valueOf(s.charAt(0))); 
      combinations(prefix + s.valueOf(s.charAt(0)), s.substring(1), PermAttr); 
      combinations(prefix,    s.substring(1), PermAttr); 
     } 
} 

이제 arrayList tryCK를 사용하여 { "A", "B"}라고합니다.

나는 또 다른 arrayList CK를 가지고 있는데, 이는 "" "A", "B"}이지만 위의 조합 함수에서 파생되었습니다.

tryCK.equals (CK)를 실행하면 true를 반환합니다.

하지만 tryCK와 CK 모두에서 다른 함수를 호출하면 tryCK는 true를 반환하고 CK는 false를 반환하지만 정확히 동일한 목록 임에도 불구하고 false를 반환합니다.

그래서, 내 질문은 .valueOf (s.charAt()) 일부 내부 형식을 사용하여 변경합니까?

설명하기가 어렵지만 전체 코드를 게시하고 싶지는 않습니다.

답변

1

첫 번째 문제 : 사실 정적 메서드 인 경우 인스턴스 메소드 인 것처럼 String.valueOf을 사용하고 있습니다. 이는 매우 오도 된 코드로 이어집니다.

두 번째 문제 : 일관된 명명 규칙이 없습니다. 매개 변수는 일반적으로 낙타가 맡았다해야한다 - 방법 PermAttr 리드 매개 변수를 명명 호출과 같은 : PermAttr라는 클래스의 정적 메소드 호출과 같은 보이는

PermAttr.add(prefix + s.valueOf(s.charAt(0))); 

.

세 번째 문제 : 당신은 아무 이유없이 String.valueOf를 사용하는 - 당신이 이미 문자열 연결을 사용하고, 그래서 그냥 사용 :

prefix + s.charAt(0) 

잘 될 것입니다.

실제로 어떤 것이 잘못 되었든간에 (문제를 설명하는 짧지 만 완전한 예제 없이는 쉽게 알 수 없음) 코드를 이해하는 것이 더 어려워지고 있습니다.

나는 위의 문제를 해결하고 이것을 이 짧은 짧지만 완전한 프로그램의 컨텍스트에 넣을 것을 제안합니다. 그러면 틀린 것을 해결하는 것이 합리적으로 쉽습니다.

2

우선, valueOf를 사용하지 않아도됩니다. 대부분의 경우 Java는 문자를 문자열의 끝에 잘 연결하기 때문입니다.

PermAttr.add(prefix + s.charAt(0)); 

둘째, 당신이 따라 valueOf 사용하려는 경우, 적어도 String 클래스가 아닌 String 객체의 인스턴스에서 참조 ...

PermAttr.add(prefix + String.valueOf(s.charAt(0))); 

셋째, 더 나은 명명 규칙 도움이 될 것입니다 :

permAttr.add(prefix + s.valueOf(s.charAt(0))); 

넷째, 당신의 ArrayList의 내용을 확인하고 시도하는 많은 방법이있다 실제로 대신 같은 값을 포함해야합니다 가정 그들이 수행

for(String s : CK) 
System.out.println(s); 

다섯 번째는, 당신이 요약 "그래서, 내 질문은, .valueOf은 (s.charAt은()) 일부 내부 유형을 변경하여 않는입니까?" 대답은

valueOf (s.charAt (int))는 String 객체를 반환합니다. 문자열을 예상하지 못했다면 그렇습니다. 그러면 객체의 유형이 변경됩니다. 이 문자열은 일반적으로 다른 모든 문자열 (연결하려는 문자열과 같은)과 함께 작동하며 String이 수행 할 수있는 모든 작업을 수행해야합니다. 따라서 String 유형을 예상했다면 아니오, 어떤 유형도 변경하지 않습니다.

여섯째, 문자열을 비교하여 equals() 메소드를 사용하는지 확인하십시오.

사용하지 않음 : 이는 기준 메모리 내의 동일한 위치에 있는지 확인한다

if(s1 == s2) 

.

USE

if(s1.equals(s2)) 

이 현의 값이 동일한 지 확인한다.

나는 그것이 내가 가진 전부라고 생각한다. 행운을 빕니다!

+0

정답입니까? – Matt