我正在查看文件名日志以及它们在指定日期的最后修改时间。它的内容如下所示:
(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?
}