質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1590閲覧

Java ソート処理

Hyonta

総合スコア36

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/05/21 05:35

編集2016/05/23 00:29

###実現したいこと
最大400万行ぐらいあるログファイルを、各行の先頭についている日時の昇順でソートしたいです。
現在は以下のソースコードなのですが、日時が同じ行については順序を変えないように実装したいです。
ログ項目間はタブ区切りとなっています。
どのように記述するべきでしょうか。

###現在のソースコード
public ArrayList<String> dateSort(ArrayList<String> outputLogList) {

Collections.sort(outputLogList); return outputLogList; }

###リストの中身
2016/03/30-02:24:39 111.221.3.3 - - [30/Mar/2016:02:24:39 +0900] 215 "GET /checkWeb_ext.html HTTP/1.0" 404 215
2016/03/30-02:24:40 111.221.3.3 - - [30/Mar/2016:02:24:40 +0900] 351 "GET /checkWeb_ext.html HTTP/1.0" 404 215
2016/03/30-02:24:40 111.221.3.4 - - [30/Mar/2016:02:24:40 +0900] 290 "GET /checkWeb_int.html HTTP/1.0" 404 215
2016/03/30-02:24:40 111.221.3.4 - - [30/Mar/2016:02:24:40 +0900] 153 "GET /checkWeb_ext.html HTTP/1.0" 404 215
2016/03/30-02:24:40 111.221.3.3 - - [30/Mar/2016:02:24:40 +0900] 237 "GET /checkWeb_int.html HTTP/1.0" 404 215
2016/03/30-02:24:41 111.221.3.3 - - [30/Mar/2016:02:24:41 +0900] 324 "GET /checkWeb_int.html HTTP/1.0" 404 215
2016/03/30-02:24:41 111.221.3.4 - - [30/Mar/2016:02:24:41 +0900] 171 "GET /checkWeb_ext.html HTTP/1.0" 404 215
2016/03/30-02:24:41 111.221.3.4 - - [30/Mar/2016:02:24:41 +0900] 334 "GET /checkWeb_int.html HTTP/1.0" 404 215
2016/03/30-02:24:44 111.221.3.3 - - [30/Mar/2016:02:24:44 +0900] 221 "GET /checkWeb_ext.html HTTP/1.0" 404 215
2016/03/30-02:24:45 111.221.3.3 - - [30/Mar/2016:02:24:45 +0900] 218 "GET /checkWeb_ext.html HTTP/1.0" 404 215

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

先頭の日時を表す文字列の順番を考えると、当然ですが早い日時ほど小さい数字になります。なので、単純に日時順に並べるならそれでもいいかと。
ただし、1秒以内に並んでいるログを並べる際、後に続く文字列で評価されることになるので、それで都合が悪ければ要検討でしょうか。

投稿2016/05/21 06:19

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hyonta

2016/05/23 00:31

回答ありがとうございます。 日時が同じ行についての考慮ができていませんでした。 質問内容を少し編集しましたので、もしよろしければ教えていただきたいです。
nob.

2016/05/23 01:41

横から失礼します。 sort(List<T> list, Comparator<? super T> c) 指定されたコンパレータが示す順序に従って、指定されたリストをソートします。 で、自前のComparatorを使うんじゃないでしょうか? 日付-時分秒 の部分だけを比較するやつを作れば?
swordone

2016/05/23 01:57

たしかに、Collections.sortは同等な要素の順番を変えないことを保証しているので、それでいいかもしれません。
guest

0

自己解決

以下のように解決できました。
皆様ありがとうございました。

public ArrayList<String> dateSort(ArrayList<String> outputDataList) { Collections.sort(outputDataList, new LogComparator()); return outputDataList; } public class LogComparator implements Comparator<String> { @Override public int compare(String list1, String list2) { // 一つ目のリストの日時取り出し String[] logArray1 = list1.split("\\t"); String logDate1 = logArray1[0]; // 二つ目のリストの日時取り出し String[] logArray2 = list2.split("\\t"); String logDate2 = logArray2[0]; // 日時比較 int result = logDate1.compareTo(logDate2); if (result == 0) { return 0; } else if (result > 0) { return 1; } else { return -1; } } }

投稿2016/05/23 08:56

Hyonta

総合スコア36

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2016/05/23 12:29

最後、resultをそのままreturnするのでもいいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問