2012-09-12 5 views
6

문자열에서 고유 한 문자를 추출하고 싶습니다. 예 : - 'AAABBBBBCCCCFFFFGGGGGDDDDJJJJJJ'이 반환됩니다. 'ABCFGDJ'문자열에서 고유 한 문자를 가져 오려면?

아래 코드를 시도했지만 지금은 최적화하고 싶습니다. 아는 사람이 있으면 알려주세요.

static string extract(string original) 
{ 
     List<char> characters = new List<char>(); 
     string unique = string.Empty; 
     foreach (char letter in original.ToCharArray())  
     { 
      if (!characters.Contains(letter)) 
      {  
        characters.Add(letter); 
       }    
      } 
     foreach (char letter in characters) 
     { 
       unique += letter;  
     }  
    return unique; 
} 
+4

"나는 그것을 최적화하고 싶습니다"- 왜죠? 프로파일 링하는 동안 발견 한 성능 병목 현상입니까? – Oded

+0

정확히 성능 병목 현상은 아니지만 나중에 얻을 수 있다면 좀 더 최적의 솔루션을 찾고있었습니다. –

+1

@Oded Rahul이 맞습니다. 루프에서 반복 된 문자열 연결을 사용하면 성능이 저하되는 것으로 잘 알려져 있습니다. 이것은'StringBuilder'의 가장 중요한 사용 사례 중 하나입니다. 또한'List '에서'Contains' 메소드를 사용하는 것은 상대적으로 비효율적입니다. 이것은'HashSet '의 가장 중요한 사용 사례 중 하나입니다. 이 코드는'List '대신'HashSet '을 사용하고'StringBuilder'를'unique'으로 바꾸는 것이 훨씬 더 효율적입니다. 하지만 linq 솔루션이 더 좋습니다 : 효율적으로 실행되고 * 더 빠르고 쉽게 코딩 할 수 있습니다. – phoog

답변

13

나는이 빠른 경우 모르겠지만 확실히 짧은

string s = "AAABBBBBCCCCFFFFGGGGGDDDDJJJJJJ"; 
var newstr = String.Join("", s.Distinct()); 
+3

이것은 HashSet을 내부적으로 사용하므로 OP (0^n) 접근보다 빠른 O (n)입니다 – BrokenGlass

+2

"AAABBBAAAA"를 "AB"로 변환하지 않습니까? 질문은 이것이 바람직한 행동인지를 정의하지 않습니다. 직관적으로 "ABA"가 올바른 대답 일 것 같습니다. – zeFrenchy

+0

@DominiqueJacquel 위의 코드는 OP의 질문에서 'extract'와 동일합니다. –

2

방법에 대한

var result = string.Join("", "AAABBBBBCCCCFFFFGGGGGDDDDJJJJJJ".Distinct()); 

당신이 System.Linq 네임 스페이스를 포함 있는지 확인하십시오.

5

또 다른 LINQ 접근하지만, string.Join를 사용하지 않는 :

var result = new string(original.Distinct().ToArray()); 

솔직히 빨리 될 문자열을 창출하는 방법을 모르겠어요. 이 StringBuilder에 추가하기 전에 내부적으로 각 요소를 문자열로 변환하는지 여부 또는이를 피하기 위해 일부 잘 알려진 유형에 대한 사용자 정의 지원이 있는지 여부에 따라 달라질 수 있습니다.

+1

남자, LINQ 멋지다. 데이터로 작업하는 완전히 새로운 방식과 같습니다. – user1477388

+0

@ user1477388 ... 예. 와서 파티에 가자! – spender

2

내가 희망이 도움이

string str = "AAABBBBBCCCCFFFFGGGGGDDDDJJJJJJ"; 
string answer = new String(str.Distinct().ToArray()); 

보십시오.

2

"AAABBBAAA"가 "ABA"를 반환해야하는 경우 다음을 수행합니다. 아주 빠르지는 않지만.

List<char> no_repeats = new List<char>(); 
no_repeats.Add(s[0]); 
for (int i = 1; i < s.Length; i++) 
{ 
    if (s[i] != no_repeats.Last()) no_repeats.Add(s[i]); 
} 
string result = string.Join("", no_repeats); 
+0

도미니크 : -이 두 가지가 유일하거나 독특한 캐릭터이기 때문에 출력물을 'AB'로 지정하고 싶습니다. !!!! 이 경우 –

+0

에서 @ L.B의 솔루션을 얻었습니다. – zeFrenchy

관련 문제