teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コード化

2016/11/17 16:09

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,4 +1,37 @@
1
1
  HashMapとか使うともっとスッキリ書け、データが多くなった場合の実行時間も短縮できそうですが。
2
2
  1のデータを、タイトルをキーに本文の長さを値としてMapに格納し、
3
3
  2のデータの2つのタイトルをキーに、1のマップから取り出して比較する。
4
+ ```java
5
+ public class Q55452 {
6
+
7
+ public static void main(String[] args) {
8
+ // まずはタイトル-本文長さのマッピングを作成
9
+ Map<String, Integer> map = new HashMap<>();
10
+ try (BufferedReader br = new BufferedReader(new FileReader("title1.txt"))) {
11
+ String data;
12
+ while ((data = br.readLine()) != null) {
13
+ String[] d = data.split(",");
14
+ try {
15
+ map.put(d[1], Integer.valueOf(d[0]));
16
+ } catch (NumberFormatException e) { }
17
+ }
18
+ } catch (IOException e) {
19
+ e.printStackTrace();
20
+ }
21
+ // リンク先・リンク元のタイトルから本文長さを引き出して比較する
22
+ // リンク先が短ければ-1,同じなら0,リンク元が短ければ1になり、どちらかが存在しない記事ならばnull
23
+ try (BufferedReader br = new BufferedReader(new FileReader("title2.txt"))){
4
- 比較にはInteger.compareを使うと1行で書ける。
24
+ List<Integer> list = br.lines()
25
+ .map(x -> Arrays.stream(x.split(","))
26
+ .map(y -> Optional.ofNullable(map.get(y)))
27
+ .collect(Collectors.toList()))
28
+ .map(l -> l.get(0).flatMap(x -> l.get(1).map(y -> x.compareTo(y))).orElse(null))
29
+ .collect(Collectors.toList());
30
+ } catch (IOException e) {
31
+ e.printStackTrace();
32
+ }
33
+
34
+ }
35
+
36
+ }
37
+ ```