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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2818閲覧

異なる配列の要素比較

shoot

総合スコア7

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2016/11/16 13:32

編集2016/11/16 14:18

現在wikipediaのダンプからデータを抽出しています。
ダンプから一部データを抽出することに成功しており、テキストファイルが二つできています。以下がその内容です。
1:「本文の長さ,ページタイトル」が一行ずつカンマ区切りで書かれている
2:「リンク先のページタイトル,リンク元のページタイトル」が一行ずつカンマ区切りで書かれている

これらのテキストファイルを配列に格納し、リンク元のページタイトルとリンク先のページタイトルの文字数を比較したいと思っていますが、どのように処理をしたらいいか思い浮かびません。ご教授いただけたらと思います。

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

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

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

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

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

MasahikoHirata

2016/11/16 13:48

まず比較したいのが質問の通り’リンク元のページタイトルとリンク先のページタイトル’であり、文字数であれば’1:’からは関係ない比較なのでは?
shoot

2016/11/16 13:54

ご指摘ありがとうございます。質問に不備がありました。1は本文の行数ではなく、本文の長さでした。また、比較したいことはリンク元のページタイトルとリンク先のページタイトルがそれぞれ持つ本文の長さです。
MasahikoHirata

2016/11/16 14:42

tetratailさん。参考になりました。
guest

回答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

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

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

shoot

2016/11/16 13:58

迅速なご返答をしていただきありがとうございました。 大変恐縮ですが、質問内容に不備がありました。 1のもつデータは、「本文の長さ,ページタイトル」です。 従って、2から比較したいページタイトルをそれぞれ抽出し、1から本文の長さを抽出・比較を行うことができればと思っています。
shoot

2016/11/16 14:40

再度返答していただきありがとうございました。 おかげさまで問題が解決いたしましたので、ベストアンサーとさせていただきます。
guest

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
swordone

総合スコア20649

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

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

shoot

2016/11/17 16:34

追記までしていただいてありがとうございました。HashMapを使用することは盲点でした。わざわざソースコードまで載せていただき大変参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問