現在wikipediaのダンプからデータを抽出しています。
ダンプから一部データを抽出することに成功しており、テキストファイルが二つできています。以下がその内容です。
1:「本文の長さ,ページタイトル」が一行ずつカンマ区切りで書かれている
2:「リンク先のページタイトル,リンク元のページタイトル」が一行ずつカンマ区切りで書かれている
これらのテキストファイルを配列に格納し、リンク元のページタイトルとリンク先のページタイトルの文字数を比較したいと思っていますが、どのように処理をしたらいいか思い浮かびません。ご教授いただけたらと思います。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/16 13:54
2016/11/16 14:42
回答2件
0
ベストアンサー
2のファイルをtitle2.txt 1をtitle.txtとした場合以下のコードで文字数の比較が行われ
a1,a2にはString[]型変数にそれぞれのデータが並んで入り、
bにはリンク元とリンク先それぞれの長さの大小が1,0,-1の数値に変換されて順に入ります
java
1import java.util.*; 2import java.io.*; 3 4class CD{ 5 6public static void main(String[] args){ 7 8ArrayList<String[]> a=new ArrayList<>(); 9ArrayList<String[]> a2=new ArrayList<>(); 10 11ArrayList<Integer> b=new ArrayList<>(); 12 13 14try(BufferedReader br=new BufferedReader(new FileReader("title2.txt"))){ 15 16String data=null; 17 18while((data=br.readLine())!=null){ 19 20String[] dat=data.split(","); 21a.add(dat); 22 23 24} 25 26 27 28}catch(Exception e){} 29 30 31 32try(BufferedReader br=new BufferedReader(new FileReader("title1.txt"))){ 33 34String data=null; 35 36while((data=br.readLine())!=null){ 37 38String dat[]=data.split(","); 39 40a2.add(dat); 41 42 43} 44 45 46 47}catch(Exception e){} 48 49 50for(String[] s:a){ 51 52String tit=s[0]; 53String tit2=s[1]; 54 55int titl=0; 56int titl2=0; 57 58for(String[] s2:a2){ 59if(tit.equals(s2[1])){ 60 61 62try{ 63titl=Integer.parseInt(s2[0]); 64}catch(Exception e){} 65 66} 67if(tit2.equals(s2[1])){ 68try{ 69titl2=Integer.parseInt(s2[0]); 70}catch(Exception e){} 71 72} 73 74} 75 76if(titl<titl2){ 77b.add(-1); 78}else if(titl==titl2){ 79b.add(0); 80}else if(titl>titl2) 81b.add(1); 82} 83 84} 85 86} 87}
投稿2016/11/16 13:44
編集2016/11/16 14:16退会済みユーザー
総合スコア0
0
HashMapとか使うともっとスッキリ書け、データが多くなった場合の実行時間も短縮できそうですが。
1のデータを、タイトルをキーに本文の長さを値としてMapに格納し、
2のデータの2つのタイトルをキーに、1のマップから取り出して比較する。
java
1public class Q55452 { 2 3 public static void main(String[] args) { 4 // まずはタイトル-本文長さのマッピングを作成 5 Map<String, Integer> map = new HashMap<>(); 6 try (BufferedReader br = new BufferedReader(new FileReader("title1.txt"))) { 7 String data; 8 while ((data = br.readLine()) != null) { 9 String[] d = data.split(","); 10 try { 11 map.put(d[1], Integer.valueOf(d[0])); 12 } catch (NumberFormatException e) { } 13 } 14 } catch (IOException e) { 15 e.printStackTrace(); 16 } 17 // リンク先・リンク元のタイトルから本文長さを引き出して比較する 18 // リンク先が短ければ-1,同じなら0,リンク元が短ければ1になり、どちらかが存在しない記事ならばnull 19 try (BufferedReader br = new BufferedReader(new FileReader("title2.txt"))){ 20 List<Integer> list = br.lines() 21 .map(x -> Arrays.stream(x.split(",")) 22 .map(y -> Optional.ofNullable(map.get(y))) 23 .collect(Collectors.toList())) 24 .map(l -> l.get(0).flatMap(x -> l.get(1).map(y -> x.compareTo(y))).orElse(null)) 25 .collect(Collectors.toList()); 26 } catch (IOException e) { 27 e.printStackTrace(); 28 } 29 30 } 31 32}
投稿2016/11/17 02:37
編集2016/11/17 16:09総合スコア20651
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。