문자열에서 문자 발생을 계산하는 간단한 방법
이 질문에 이미 답변이 있습니다.
문자열에 문자가 몇 번 나타나는지 확인하는 간단한 방법 (모든 문자열을 수동으로 탐색하거나 indexOf에 대해 루프하는 대신)이 있습니까?
"abdsd3 $ asda $ asasdd $ sadas"가 있고 $가 3 번 나타나기를 원합니다.
public int countChar(String str, char c)
{
int count = 0;
for(int i=0; i < str.length(); i++)
{ if(str.charAt(i) == c)
count++;
}
return count;
}
이것은 확실히 가장 빠른 방법입니다. 정규식은 여기에서 훨씬 느리고 이해하기 어려울 수 있습니다.
기능적 스타일 (자바 8, 재미를 위해) :
str.chars().filter(num -> num == '$').count()
최적은 아니지만 발생 횟수를 계산하는 간단한 방법 :
String s = "...";
int counter = s.split("\\$", -1).length - 1;
노트 :
- 달러 기호는 특수 정규식 기호이므로 백 슬래시로 이스케이프해야합니다.
- 백 슬래시는 개행 문자와 같은 이스케이프 문자에 대한 특수 기호이므로 백 슬래시로 이스케이프해야합니다.
- split의 두 번째 인수는 빈 후행 문자열이 제거되는 것을 방지합니다.
Apache Commons '를 사용할 수 있습니다 StringUtils.countMatches(String string, String subStringToCount)
.
어쨌든 전체 문자열을 스캔하기 때문에 동일한 big-Oh 비용 (n)으로 전체 문자 수를 만들고 원하는 수의 조회를 수행 할 수 있습니다.
public static Map<Character,Integer> getCharFreq(String s) {
Map<Character,Integer> charFreq = new HashMap<Character,Integer>();
if (s != null) {
for (Character c : s.toCharArray()) {
Integer count = charFreq.get(c);
int newCount = (count==null ? 1 : count+1);
charFreq.put(c, newCount);
}
}
return charFreq;
}
// ...
String s = "abdsd3$asda$asasdd$sadas";
Map counts = getCharFreq(s);
counts.get('$'); // => 3
counts.get('a'); // => 7
counts.get('s'); // => 6
문자 빈도 수는 일부 응용 프로그램 (예 : 교육)의 일반적인 작업이지만 핵심 Java API에 포함 할 수있을만큼 일반적이지 않습니다. 따라서 자신 만의 함수를 작성해야 할 것입니다.
for each 루프를 사용할 수도 있습니다. 읽기가 더 간단하다고 생각합니다.
int occurrences = 0;
for(char c : yourString.toCharArray()){
if(c == '$'){
occurrences++;
}
}
나는 당신이 얻을 것으로 기대했던 "하나의 라이너"가 다음과 같다고 믿는다.
"abdsd3$asda$asasdd$sadas".replaceAll( "[^$]*($)?", "$1" ).length();
요구 사항은 다음과 같습니다.
( 대신 수동으로 모든 문자열 통과의 , 또는 같이 IndexOf에 대한 루프 )
and let me add: that at the heart of this question it sounds like "any loop" is not wanted and there is no requirement for speed. I believe the subtext of this question is coolness factor.
Something a bit more functional, without Regex:
public static int count(String s, char c) {
return s.length()==0 ? 0 : (s.charAt(0)==c ? 1 : 0) + count(s.substring(1),c);
}
It's no tail recursive, for the sake of clarity.
Traversing the string is probably the most efficient, though using Regex to do this might yield cleaner looking code (though you can always hide your traverse code in a function).
Well there are a bunch of different utilities for this, e.g. Apache Commons Lang String Utils
but in the end, it has to loop over the string to count the occurrences one way or another.
Note also that the countMatches
method above has the following signature so will work for substrings as well.
public static int countMatches(String str, String sub)
The source for this is (from here):
public static int countMatches(String str, String sub) {
if (isEmpty(str) || isEmpty(sub)) {
return 0;
}
int count = 0;
int idx = 0;
while ((idx = str.indexOf(sub, idx)) != -1) {
count++;
idx += sub.length();
}
return count;
}
I was curious if they were iterating over the string or using Regex.
This is simple code, but of course a little bit slower.
String s = ...;
int countDollar = s.length()-s.replaceAll("\\$","").length();
int counta = s.length()-s.replaceAll("a","").length();
An even better answer is here in a duplicate question
You can look at sorting the string -- treat it as a char array -- and then do a modified binary search which counts occurrences? But I agree with @tofutim that traversing it is the most efficient -- O(N) versus O(N * logN) + O(logN)
There is another way to count the number of characters in each string. Assuming we have a String as String str = "abfdvdvdfv"
We can then count the number of times each character appears by traversing only once as
for (int i = 0; i < str.length(); i++)
{
if(null==map.get(str.charAt(i)+""))
{
map.put(str.charAt(i)+"", new Integer(1));
}
else
{
Integer count = map.get(str.charAt(i)+"");
map.put(str.charAt(i)+"", count+1);
}
}
We can then check the output by traversing the Map as
for (Map.Entry<String, Integer> entry:map.entrySet())
{
System.out.println(entry.getKey()+" count is : "+entry.getValue())
}
public static int countChars(String input,char find){
if(input.indexOf(find) != -1){
return countChars(input.substring(0, input.indexOf(find)), find)+
countChars(input.substring(input.indexOf(find)+1),find) + 1;
}
else {
return 0;
}
}
참고URL : https://stackoverflow.com/questions/6100712/simple-way-to-count-character-occurrences-in-a-string
'Programing' 카테고리의 다른 글
오류 403 : 액세스가 구성되지 않았습니다. (0) | 2020.11.29 |
---|---|
신속한 스크립트에서 터미널 명령을 어떻게 실행합니까? (0) | 2020.11.29 |
Xcode 6 iPhone 시뮬레이터 용 iOS 8 UITableView에서 SeparatorInset 제거 (0) | 2020.11.29 |
AndroidJUnit4 및 ActivityTestRule을 단위 테스트 클래스로 가져올 수없는 이유는 무엇입니까? (0) | 2020.11.29 |
트랩 표현 (0) | 2020.11.28 |