2012-10-11 3 views
2

파일 이름 및 지정된 날짜에 마지막으로 수정 된 시간의 로그를보고 있습니다. 내용은 다음과 같습니다.하위 문자열 내 하위 문자열 정렬

(comment:file_02389.txt,lastmodified:Wed Oct 10 19:10:49) 
(comment:file_02342.txt,lastmodified:Wed Oct 10 17:16:08) 
(comment:file_02315.txt,lastmodified:Wed Oct 10 18:45:12) 
(comment:file_02344.txt,lastmodified:Wed Oct 10 08:31:01) 

로그는 줄 바꿈없이 단일 문자열로 제공됩니다. 가장 최근에 수정 된 파일을 찾으려면 String을 구문 분석하고 싶습니다. 즉, 최근 날짜가 있으므로이 경우 file_02389.txt입니다. 가상 파일은 미래에 변경 될 수 있지만 동일한 파일이 두 번 이상 수정되면 파일 이름이 고유하지는 않지만 각 "주석"의 문자 길이는 일정합니다.

가장 확장 성이 뛰어나고 유지 관리가 쉬운 최신 파일을 찾는 방법이 있습니까? 실행 시간과 기억은 중요한 요소가 아닙니다. 주요 관심사는 초보 프로그래머가 코드를 이해하고 작업 할 수 있다는 것입니다.

제 생각에는 사용자 지정 Comparator로 정렬 할 수있는 List로 문자열을 분할하는 것이 었습니다. 나는이 단순하지만 확장되지이라고 생각 :

그것은 작동하지만 선 길이이 하나의 경우에만 유용하다 비교기에 따라 문자열을 사용
{//given String log 
... 
//setup 
List<String> temp = Arrays.asList(log.trim().split("\\(comment\\:")); //too complex for one line? 
//the first entry is blank so it must be removed else a substring() call will fail 
if(temp.get(0).equals("")) 
    temp.remove(0); 
int period = full.get(0).indexOf('.'); 
int colon = full.get(0).indexOf(':'); 

//process 
Collections.sort(temp, DATE); 
return test.get(test.size()-1).substring(0, period)) //last entry is the most recent 
} 

public final Comparator<String> DATE = new Comparator<String>() 
{ 
public int compare(String s1, String s2) 
    { 
     return s1.substring(28).compareTo(s2.substring(28)); 
    } 
}; 

. 나는 .split의 사용을 싫어하고 첫 번째 항목을 제거해야하지만 그 대안 인 경우 정규 표현식을 이해하기가 어렵지 않습니다. 정수 또는 날짜 객체로 비교하는 대신 문자열을 날짜로 처리하는 것은 바람직하지 않지만 코드 줄을 저장합니다.

현재 임의적으로 보이는 숫자가있는 일회용 비교기를 만들지 않는 정렬 된지도를 사용하고 있지만 특수한지도는 내가하려는 것을 다소 복잡하게 보입니다. 나는 여전히 파일 이름에 대해 하나의 배열을 만드는 것, 시간에 대해 또 하나의 배열을 만드는 것, 시간 배열을 정렬 할 수 있도록 세 번째로 시간 배열을 정렬 할 수 있으며 사본의 해당 인덱스와 비교하여 마지막 값을 비교하는 것이 낫다고 생각합니다.

{ 
... 
//same setup as before 
//process 
//key is time, value is file name 
SortedMap<String, String> map = new TreeMap<String, String>(); 
for(String s : temp) 
    map.put(s.substring(colon+1), s.substring(0, period)); 
//the value to which the last key is mapped is guaranteed to be the most recent file 
return map.get(map.lastKey()); //too complex for one line? 
} 
+0

예를 들어 10 월 10 일이 모두 월입니다. 및 수요일. - 불가능합니다 ... 둘째 - 문자열 비교를 사용하여 날짜 비교 - 작동하지 않아야합니다. – alfasin

+0

오타가 내 부분에서 월요일을 수요일로 변경했습니다. 감사합니다. 비교는 날짜가 문자열로 처리되기 때문에 효과가 있습니다. 'Wed Oct 10 19 : 10 : 49'은 'Wed Oct 10 17 : 16 : 08'보다 더 많이 반환됩니다. 왜냐하면 '9'는 '7'보다 많기 때문입니다. 분명히 형식이 일관되고 날짜가 _how much_> 또는 일 때만 사용됩니다. – apcris

+0

Nope. 다른 요일을 비교하기 시작할 때까지 유지됩니다. W> T 그러므로 당신은 그 Wend를 얻을 것이다. > 목. – alfasin

답변

2

이 작품은 마음에 드시겠습니까? 기본적으로 각 줄에서 날짜를 구문 분석하여 "쌍"개체 컬렉션을 작성하므로 날짜를 기준으로 컬렉션을 정렬 할 수 있습니다.

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Date; 
import java.util.List; 


public class Parse { 

    /** 
    * @param args 
    * @throws ParseException 
    */ 
    public static void main(String[] args) throws ParseException { 
     StringBuilder sb = new StringBuilder(); 
     sb.append("(comment:file_02389.txt,lastmodified:Wed Oct 10 19:10:49)").append("\n"); 
     sb.append("(comment:file_02342.txt,lastmodified:Wed Oct 10 17:16:08)").append("\n"); 
     sb.append("(comment:file_02315.txt,lastmodified:Wed Oct 10 18:45:12)").append("\n"); 
     sb.append("(comment:file_02344.txt,lastmodified:Wed Oct 10 08:31:01)").append("\n"); 

      //create a date format that can parse dates formatted in the file 
     SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss"); 

      //read the file into an array of lines (or read one line at a time) 
     String[] lines = sb.toString().split("\n"); 

      //create an array of pair objects to hold the line as well as the date 
     List<Pair> list = new ArrayList<Pair>(); 


     for(int i=0;i<lines.length;i++){ 
        //get the date component of the line 
      String dateString = lines[i].substring(lines[i].length()-20, lines[i].length()-1); 

      Pair pair = new Pair(); 
      pair.date = sdf.parse(dateString); 
      pair.line = lines[i]; 
      list.add(pair); 
     } 
     Collections.sort(list); 
     System.out.println(list.get(list.size()-1).line); 
    } 
} 
class Pair implements Comparable<Pair>{ 

    public Date date; 
    public String line; 

    @Override 
    public int compareTo(Pair o) { 
     return date.compareTo(o.date); 
    } 

} 
+0

내 접근 방식보다 효과적이고 논리적으로 시작됩니다. 필요한 날짜 형식이나 파서가 내장되어 있는지 확실하지 않았습니다. – apcris

2

나는에 관심이 다른 사람이 제안하지만 (몇 쿼리를 대체하여) 내 첫 번째 본능 JSON 배열로 원래 문자열을 설정 어떨지. 그런 다음 json을 직렬화 해제하고 즉시 두 개의 속성, 주석 및 날짜가있는 객체 인스턴스 목록을 얻을 수 있습니다.

이러한 개체에 대한 비교자를 사용하여 원하는 방식으로 목록을 정렬 할 수 있습니다.

+0

이것은 정확히 내가 제안하려고했던 것입니다. 길 쉽습니다. – dispake

+0

json에 익숙하지 않지만 xml을 사용했습니다.나는이 접근법이 방법의 복잡성을 추상화하고 다른 응용에 유용 할 수있는 방법을 좋아한다. – apcris

+1

오른쪽. xml 또는 json, 둘 다 작동합니다. 나는 json을 더 좋아하는 경향이 있지만, 당신이 쫓고있는 것에 대해서는 실제로 상호 교환이 가능합니다. – Lolo