0

多かれ少なかれ次のように見える HashMap があります。

private HashMap<String, String> fu = new HashMap<String, String>();

fu.put("16:04:00.476", "A");
fu.put("16:09:58.228", "B");
fu.put("16:17:58.227", "C");
fu.put("16:22:42.478", "D");
fu.put("16:27:23.728", "E");
fu.put("16:38:34.977", "F");
fu.put("16:46:46.227", "G");

bar と呼ばれる別のタイムスタンプがあり、適切な文字を見つけたいと考えています。

private String findLetter(String timestamp) {
   return "";
}

HashMap のタイムスタンプは、開始時刻と見なすことができます。つまり、A は 16:04:00.476 に開始し、B が開始するまで続きます。B は C が始まるまで続きます。これで、このメソッドは、パラメーターとして渡されたタイムスタンプが配置されている文字を返す必要があります。

最初にしたことは、タイム スタンプを Date オブジェクトに変換して、Date#after メソッドを使用して特定の開始時刻以降かどうかを確認することですが、それが次の開始時刻よりも前であることを確認するにはどうすればよいでしょうか?

4

5 に答える 5

6

HashMap は順序付けされていないため、最初にたとえば TreeMap を使用する必要があります。次のエントリを見て、現在のタイムスタンプより後かどうかを確認します

于 2013-06-06T19:40:37.853 に答える
0

Stringすでにs をs に解析している場合はDate、推奨されていない唯一のメソッドの 1 つを使用できます。このメソッドは、ミリ秒を表すgetTime()を返します。long

0 がEpochであるとすると、この値を比較できます。この回答を書いているときは です1370548040476

于 2013-06-06T19:50:03.247 に答える
0

キーの形式が変わらない場合は、次のようにするだけです。

private NavigableMap<String, String> fu = new TreeMap<>();

その後

private String findLetter(String timestamp) {
    return map.get(map.lowerKey(timestamp));
}

将来的に形式を変更する予定がある場合は、次のことを行うことができます (ただし、時間形式を調整する必要があります)。

private static final DateFormat DATE_FORMAT = new SimpleDateFormat("HH:mm:ss.SSS");

private NavigableMap<String, String> fu = new TreeMap<>(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        try {
            long t1 = DATE_FORMAT.parse(o1).getTime();
            long t2 = DATE_FORMAT.parse(o2).getTime();
            return Long.compare(t1, t2);
        } catch (ParseException e) {
            throw new IllegalArgumentException(e);
        }
    }
});

そして、あなたは簡単に行うことができます

private String findLetter(String timestamp) {
       return map.get(map.lowerKey(timestamp));
}
于 2013-06-06T19:48:22.447 に答える
0

TreeMap提案されているように、に基づく簡単なソリューションを次に示します。表示されたすべての時点が同じ日にあると想定しています。

class Sample {

    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");

    private static final String DEFAULT_DAY_PREFIX = "1980-05-15 ";

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

        TreeMap<Long, String> orderedDates = new TreeMap<Long, String>();

        orderedDates.put(parseToDate("16:04:00.476"), "A");
        orderedDates.put(parseToDate("16:09:58.228"), "B");
        orderedDates.put(parseToDate("16:17:58.227"), "C");

        System.out.println(orderedDates.floorEntry(parseToDate("16:04:00.500")).getValue());
        System.out.println(orderedDates.floorEntry(parseToDate("16:09:58.100")).getValue());
        System.out.println(orderedDates.floorEntry(parseToDate("16:09:58.300")).getValue());
        System.out.println(orderedDates.floorEntry(parseToDate("16:17:58.300")).getValue());
    }

    private static long parseToDate(String dayPoint) throws ParseException {
        return SDF.parse(DEFAULT_DAY_PREFIX + dayPoint).getTime();
    }
}
于 2013-06-06T19:48:34.857 に答える