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)

日志以单个字符串的形式给出,没有换行符。我想解析字符串以找到最近修改的文件,即在这种情况下具有最新日期,因此 file_02389.txt。每个“注释”的字符长度是恒定的,尽管假设将来可能会发生变化,并且如果同一文件被多次修改,文件名将不会是唯一的。

是否有一种最可扩展/可维护的方式来查找最新文件?执行时间和内存不是重要的因素。主要关注的是初学者程序员可以理解和使用代码。

我的第一个想法是将字符串拆分为可以使用自定义比较器排序的列表。我认为这很简单但不可扩展:

{//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?
}
4

2 回答 2

2

我对其他人的建议很感兴趣,但我的第一直觉是将您的原始字符串转换为 json 数组(带有一些替换查询)。然后,您可以反序列化该 json 并立即获取对象实例列表,每个实例都有两个属性,注释和日期。

您可以为这些对象设置一个比较器,以便按照您想要的方式对列表进行排序。

于 2012-10-11T21:08:05.523 回答
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);
    }

}
于 2012-10-11T21:55:09.293 回答