2013-03-06 2 views
0

텍스트 파일에서 요일의 발생 횟수를 계산하는 코드가 있습니다. 현재로서는 해당 줄의 유일한 문자열 인 경우에만 요일을 계산합니다. 예를 들어, (월요일 abcd)라는 줄이 있으면 계산에 그 월요일을 계산하지 않습니다. indexOf와 split, trimming을 사용하여 해시 맵에 다시 추가하려고했으나 둘 중 하나를 수행하는 방법을 파악할 수 없습니다. Heres는동일한 줄에있는 문자열의 발생

코드의 일부, 나는 키워드 선언이 전에, 출력 부분을 TEXTFILE을 열고을 heres 제로

public class DayCounter 
{ 

public static void main(String args[]) throws IOException 
{ 

    String[] theKeywords = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; 

    // put each keyword in the map with value 0 
    Map<String, Integer> DayCount = new HashMap<String, Integer>(); 
    for (String str : theKeywords) 
    { 
     DayCount.put(str, 0); 
    } 

    try (BufferedReader br = new BufferedReader(new FileReader("C:\\Eclipse\\test.txt"))) 
    { 

String sCurrentLine; 

// read lines until reaching the end of the file 
while ((sCurrentLine = br.readLine()) != null) 
{ 


    if (sCurrentLine.length() != 0) 
    { 

    // extract the words from the current line in the file 
    if (DayCount.containsKey(sCurrentLine)) 
    { 
     DayCount.put(sCurrentLine, DayCount.get(sCurrentLine) + 1); 
    } 
    } 
    } 

의 값으로지도에서 각 키워드를 넣어

for(String day : theKeywords) 
{ 
    System.out.println(day + " = " + DayCount.get(day)); 

} 

답변

1

당신은 일주일의 실제 일에 대한 문자열 내에서 검색 할 필요가있다. 지금 당신은 "DayCount가 [전체 줄]이라는 이름으로 키를 포함하고 있습니까?"라고 묻습니다. 여기서 원하는 것은 각 요일의 모든 발생을 각 줄마다 확인하는 것입니다. 당신이 반복하는 문제를 통해 발생하는 때문에

while ((sCurrentLine = br.readLine()) != null) { 
    // For every line in the reader... 

    for (String dayOfWeek : (Set<String>) DayCount.keySet()) { 
     // For each day of the week (the keys in the DayCount map), count how 
     // many times that key shows up in the line. 
     int occurrences = sCurrentLine.split(dayOfWeek, -1).length - 1; 

     // Now increase the appropriate counter by the number of occurrences (0+) 
     DayCount.put(dayOfWeek, (Integer) DayCount.get(dayOfWeek) + occurrences); 
    } 
} 

:이 작업을 수행하기위한 신속하고 더러운 방법 (예를 들어, "월요일") 그 단어의 주위에 문자열을 분할하고 결과 목록의 길이를 계산하는 것입니다 (이 신비이지만, 원래 질문의 범위를 벗어난) (내가 코멘트에서 언급 한 바와 같이 - 내부 루프의 변화를주의), 당신은이처럼 쓸 수 설정 :

while ((sCurrentLine = br.readLine()) != null) { 
    // For every line in the reader... 

    //NOTE: I strongly advise renaming theKeywords to something more descriptive! 
    for (String dayOfWeek : theKeywords) { 
     // For each day of the week, count how many times that key shows up. 
     int occurrences = sCurrentLine.split(dayOfWeek, -1).length - 1; 

     // Now increase the appropriate counter by the number of occurrences (0+) 
     DayCount.put(dayOfWeek, (Integer) DayCount.get(dayOfWeek) + occurrences); 
    } 
} 

이를 모두 매우 간단합니다. 이상한 비트는 다음과 같습니다.

int occurrences = sCurrentLine.split(dayOfWeek, -1).length - 1; 

이 코드는 현재 줄에서 split 메서드를 호출합니다. 그것은 "maxSplits"로 어색하게 보이는 -1 주위를 나누기 위해 요일에지나갑니다. 이 음수 값은 split 메서드에 결과의 줄 끝 부분에 빈 문자열을 포함하도록 지시합니다. 그렇지 않으면 라인 "a b c Monday "은 예상대로 길이가 2 인 배열을 반환하지만 (["a b c ", " "]) "a b c Monday" (마지막에 공백이 없음)은 마지막 항목이 비어 있기 때문에 길이가 1 인 배열을 반환합니다.

요일을 기준으로 정확한 배열을 나누면 그 항목의 수를 세고 실제 수를 얻기 위해 1을 뺍니다. 우리 배열의 최소 크기가 1이기 때문에 이것은 항상 유효합니다 (분할이 발생하지 않는 경우 원본 문자열이 반환 된 배열의 유일한 요소이기 때문에).

+0

이것이 작동하지 않는 것 같습니다.이것이 내가 지금 TEXTFILE에 무엇을하고 나는 점점 오전 (화요일 = -1 월요일 = 0, 수요일 = 1)의' BC 데프 GHIJ * 월요일 수요일 월요일 화요일 Monday' 월요일 수요일 월요일은 모두 같은 줄에있다. – user2007843

+0

@ user2007843 -1이 어디서 왔는지 상상조차 할 수 없다. 방금 설명한 파일과 함께 실행하면 화요일 = 1, 수요일 = 1이됩니다. 분할 메서드는 그 뒤에 문자가 없으면 마지막 메서드를 선택하지 않기 때문에 - 그것을 제공해야합니다. 마지막에 빈 일치를 허용하는 다른 매개 변수 (지금 내 대답은 고정되어 있으며 찾을 수있는 모든 경우에 대한 작업). –

+0

이 줄은 나에게'(Set ) DayCount.keySet()'문제를 준다. 오류는 배열이나 java.lang.iterable의 인스턴스에 대해서만 반복 할 수 있다고 말한다. – user2007843

0

DayCount 클래스의 사양은 무엇입니까? 코드의 의도가 무엇인지 알지 못하면 그 코드의 의도를 파악하기가 어렵습니다.

어쨌든 contains 메소드를 사용하여 한 행에 요일이 포함되어 있는지 확인할 수 있습니다.

if(sCurrentLine.contains("Monday") || sCurrentLine.contains("Tuesday") || ...) then ...

+0

원래 질문에 코드 시작 부분을 추가했습니다 – user2007843

+0

정확히 이것을 코드에 정확히 써야합니까? – user2007843

관련 문제