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

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

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

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

Q&A

解決済

4回答

1775閲覧

Javaもしくは、openoffice calcを用いて様々な文字列を数値に変換したい

kohekoh

総合スコア140

Java

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

0グッド

0クリップ

投稿2017/01/11 13:22

編集2017/01/12 01:31

Javaについての質問です。

このようなテキストファイルがあるとします

userID venueID star
g;ajgfadjfajkfa alkjf;akjdf 5
dkj:ajkd:fjka:d odfka:lsdfk 4
;adlkjf;akdjfaa odfka:lsdfk 3
g;ajgfadjfajkfa a;kf:akfa:f 4
g;ajgfadjfajkfa dlkfa:lkfaa 3

このファイルを
同じIDのものは同じ数値に置換するような
コードを教えていただけるとありがたいです。

結果として

userID venueID star
1 101 5
2 102 4
3 102 3
1 103 4
1 104 3

このようになればよいです
よろしくお願いします

追記:ファイルサイズは非常に大きいので
一つ一つ読み込んで重複しているものは
同じ数字、重複してないものは異なる数字としたいです

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

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

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

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

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

guest

回答4

0

数が少ないならuserID、venueIDそれぞれのListを作り、
0. 1行ごとに各IDがそれぞれのListに入っているかどうか、indexOfで調べる。
0. 入っていれば0以上の値が返ってくるので、それに+1(venueIDなら+101)した値で置換する
入っていなければ-1が返ってくるので、そのIDをListに格納し、sizeで取得できるリストサイズで置換する(venueIDならそれに+100)

数が多いならHashMapを使います。(置換文字列の取得だけ、Java8使用)

java

1Map<String, String> userIdMap = new HashMap<>(); 2String rep = userIdMap.computeIfAbsent("g;ajgfadjfajkfa", k -> String.valueOf(userIdMap.size() + 1));

投稿2017/01/11 14:56

swordone

総合スコア20651

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

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

0

swordoneさん、御指導どうもありがとうございます。
tetratailさんのコードをお手本に直しました。

投稿2017/01/12 04:14

seastar3

総合スコア2285

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

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

0

未検証ですがハッシュをベタに並べ、コンソール出力するサンプルです。
ご参考になれば、適時直して適用してみて下さい。

relayUserVnue.java

java

1import java.io.BufferedReader; 2import java.io.FileReader; 3import java.io.IOException; 4import java.util.HashMap; 5 6class relayUserVnue{ 7 public static void main(String args[]){ 8 9// 会場IDのハッシュ(連想配列)を用意 10 HashMap<String,Integer> venueIdMap = new venueMap<String,Integer>(); 11 12 venueIdMap.put("alkjf;akjdf", 101); 13 venueIdMap.put("odfka:lsdfk", 102); 14 venueIdMap.put("a;kf:akfa:f", 103); 15 venueIdMap.put("dlkfa:lkfaa", 104); 16// さらに続けば同じ書式でキーと対応する番号を追加する 17 18// ユーザIDのハッシュ(連想配列)を用意 19 HashMap<String,int> userIdMap = new HashMap<String,int>(); 20 21 userIdMap.put("g;ajgfadjfajkfa", 1); 22 userIdMap.put("dkj:ajkd:fjka:d", 2); 23 userIdMap.put(";adlkjf;akdjfaa", 3); 24// さらに続けば同じ書式でキーと対応する番号を追加する 25 26// 入力データファイルを仮に"UserVenueStar.txt"としている 27 try (BufferedReader reader = new BufferedReader(new FileReader("UserVenueStar.txt"))) { 28 String strData = reader.readLine(); 29 String[] strItem; 30 int userId, venueId, star; 31 System.out.println("userID venueID star"); 32 while (strData != null){ 33 strData = reader.readLine(); 34 strItem = strData.split(" "); 35 if (userIdMap.containsKey(strItem[0])){ 36 userId = userIdMap.containsKey(strItem[0]); 37 }else{ 38 userId = 0; 39 } 40 41 if (venueIdMap.containsKey(strItem[1])){ 42 venueId = venueIdMap.containsKey(strItem[1]); 43 }else{ 44 venueId = 0; 45 } 46 47 star = sstrItem[2]; 48 System.out.println(userId + " " + venueId + " " + star); 49 } 50 } catch (Exception e) { 51 } 52 } 53}

投稿2017/01/11 15:15

編集2017/01/12 04:07
seastar3

総合スコア2285

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

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

swordone

2017/01/12 02:06

HashMapなどに使うジェネリクスにはプリミティブのintは使えません。Integerにしてください。
退会済みユーザー

退会済みユーザー

2017/01/12 04:05

上のコードを訂正したものです 以下で動きます import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; class YUE{ public static void main(String args[]){ // 文字列ビルダーオブジェクトを用意 StringBuilder builder = new StringBuilder(); // 会場IDのハッシュ(連想配列)を用意 HashMap<String,Integer> venueIdMap = new HashMap<>(); venueIdMap.put("alkjf;akjdf", 101); venueIdMap.put("odfka:lsdfk", 102); venueIdMap.put("a;kf:akfa:f", 103); venueIdMap.put("dlkfa:lkfaa", 104); // さらに続けば同じ書式でキーと対応する番号を追加する // ユーザIDのハッシュ(連想配列)を用意 HashMap<String,Integer> userIdMap = new HashMap<>(); userIdMap.put("g;ajgfadjfajkfa", 1); userIdMap.put("dkj:ajkd:fjka:d", 2); userIdMap.put(";adlkjf;akdjfaa", 3); // さらに続けば同じ書式でキーと対応する番号を追加する // 入力データファイルを仮に"UserVenueStar.txt"としている try (BufferedReader reader = new BufferedReader(new FileReader("17.txt"))) { String strDat = reader.readLine(); String[] array; int userId, venueId; String star; System.out.println("userID venueID star"); while (strDat != null){ builder.append("" + System.getProperty("line.separator")); String strData[] = reader.readLine().split("[ ]+"); array = strDat.split("[ ]+"); if (userIdMap.containsKey(strData[0])){ userId = userIdMap.get(strData[0]); }else{ userId = 0; } if (venueIdMap.containsKey(strData[1])){ venueId = venueIdMap.get(strData[1]); }else{ venueId = 0; } star = strData[2]; System.out.println(userId + " " + venueId + " " + star); } } catch (Exception e) { } } }
guest

0

ベストアンサー

上と全く同じ変換結果にはなりませんが、
同じIDのものは同じ数値に置換する
という意味であれば、以下でできると思います
入力ファイルの1行目には
userID venueID star
が入っているという前提のコードです

java

1import java.io.*; 2import java.util.*; 3 4class GOV { 5 6 public static void main(String[] args) { 7 HashSet<String> uID = new HashSet<>(); 8 HashSet<String> vID = new HashSet<>(); 9 HashMap<String, Integer> uSID = new HashMap<>(); 10 HashMap<String, Integer> vSID = new HashMap<>(); 11 ArrayList<String> uIID = new ArrayList<>(); 12 ArrayList<String> vIID = new ArrayList<>(); 13 ArrayList<Integer> uIIID = new ArrayList<>(); 14 ArrayList<Integer> vIIID = new ArrayList<>(); 15 ArrayList<Integer> star = new ArrayList<>(); 16 17 try (BufferedReader br = new BufferedReader(new FileReader("17.txt"))) {//入力ファイルパス 18 19 String dat = ""; 20 dat = br.readLine(); 21 while ((dat = br.readLine()) != null) { 22 String[] s = dat.split("[ ]+"); 23 24 uID.add(s[0]); 25 vID.add(s[1]); 26 27 uIID.add(s[0]); 28 vIID.add(s[1]); 29 30 star.add(Integer.parseInt(s[2])); 31 32 } 33 34 } catch (Exception e) { 35 } 36 37 int co = 0; 38 for (String s1 : uID) { 39 co++; 40 uSID.put(s1, co); 41 } 42 co = 0; 43 for (String s1 : vID) { 44 co++; 45 vSID.put(s1, co); 46 } 47 48 for (String s1 : uIID) { 49 uIIID.add(uSID.get(s1)); 50 } 51 for (String s1 : vIID) { 52 vIIID.add(vSID.get(s1) + 100); 53 } 54 System.out.println("userID\tvenueID\tstar "); 55 for (int a = 0; a < uIID.size(); a++) { 56 System.out.print(uIIID.get(a) + "\t"); 57 System.out.print(vIIID.get(a) + "\t"); 58 System.out.print(star.get(a)); 59 System.out.println(); 60 } 61 62 try (BufferedWriter br = new BufferedWriter(new FileWriter("18.txt"))) {//出力ファイルパス 63 br.write("userID\tvenueID\tstar "); 64 br.newLine(); 65 66 for (int a = 0; a < uIID.size(); a++) { 67 br.write(uIIID.get(a) + "\t"); 68 br.write(vIIID.get(a) + "\t"); 69 br.write(star.get(a) + ""); 70 if (a != uIIID.size() - 1) { 71 br.newLine(); 72 } 73 } 74 75 } catch (Exception e) { 76 } 77 78 } 79 80}

サンプルとして提示したデータと区切り文字が異なっていたので、実際に使用されたデータの区切り文字に対してコードを以下に組みなおしました

java

1import java.io.*; 2import java.util.*; 3 4class GOV { 5 6 public static void main(String[] args) { 7 HashSet<String> uID = new HashSet<>(); 8 HashSet<String> vID = new HashSet<>(); 9 HashMap<String, Integer> uSID = new HashMap<>(); 10 HashMap<String, Integer> vSID = new HashMap<>(); 11 ArrayList<String> uIID = new ArrayList<>(); 12 ArrayList<String> vIID = new ArrayList<>(); 13 ArrayList<Integer> uIIID = new ArrayList<>(); 14 ArrayList<Integer> vIIID = new ArrayList<>(); 15 ArrayList<Integer> star = new ArrayList<>(); 16 17 try (BufferedReader br = new BufferedReader(new FileReader("17.txt"))) { 18 19 String dat = ""; 20 dat = br.readLine(); 21 while ((dat = br.readLine()) != null) { 22 if (dat.length() == 0) 23 continue; 24 25 String[] s = dat.split(",\t"); 26 s[0] = s[0].trim(); 27 s[1] = s[1].trim(); 28 s[2] = s[2].trim(); 29 30 uID.add(s[0]); 31 vID.add(s[1]); 32 33 uIID.add(s[0]); 34 vIID.add(s[1]); 35 36 star.add(Integer.parseInt(s[2])); 37 38 } 39 40 } catch (Exception e) { 41 e.printStackTrace(); 42 } 43 44 int co = 0; 45 for (String s1 : uID) { 46 co++; 47 uSID.put(s1, co); 48 } 49 co = 0; 50 for (String s1 : vID) { 51 co++; 52 vSID.put(s1, co); 53 } 54 55 for (String s1 : uIID) { 56 uIIID.add(uSID.get(s1)); 57 } 58 for (String s1 : vIID) { 59 vIIID.add(vSID.get(s1) + 100); 60 } 61 System.out.println("userID\tvenueID\tstar "); 62 for (int a = 0; a < uIID.size(); a++) { 63 System.out.print(uIIID.get(a) + "\t"); 64 System.out.print(vIIID.get(a) + "\t"); 65 System.out.print(star.get(a)); 66 System.out.println(); 67 } 68 69 try (BufferedWriter br = new BufferedWriter(new FileWriter("18.txt"))) { 70 br.write("userID\tvenueID\tstar "); 71 br.newLine(); 72 73 for (int a = 0; a < uIID.size(); a++) { 74 br.write(uIIID.get(a) + "\t"); 75 br.write(vIIID.get(a) + "\t"); 76 br.write(star.get(a) + ""); 77 if (a != uIIID.size() - 1) { 78 br.newLine(); 79 } 80 } 81 82 } catch (Exception e) { 83 } 84 85 } 86 87}

投稿2017/01/11 14:09

編集2017/01/12 04:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

swordone

2017/01/11 14:39

ものすごーく無駄が多く感じます…
kohekoh

2017/01/12 03:49

userID venueID star 1 101 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(ArrayList.java:653) at java.util.ArrayList.get(ArrayList.java:429) at GOV.main(GOV.java:65) このようなエラーをはかれました どういうことですかね…
退会済みユーザー

退会済みユーザー

2017/01/12 04:03

こちらの環境で 17.txt というファイルに userID venueID star g;ajgfadjfajkfa alkjf;akjdf 5 dkj:ajkd:fjka:d odfka:lsdfk 4 ;adlkjf;akdjfaa odfka:lsdfk 3 g;ajgfadjfajkfa a;kf:akfa:f 4 g;ajgfadjfajkfa dlkfa:lkfaa 3 のデータをそのまま入れて実行すると 18.txtに userID venueID star 1 104 5 2 102 4 3 102 3 1 103 4 1 101 3 という出力が出たコードです 何のデータを入れたかにもよるのかも知れません どのようなデータを入れたのでしょうか
kohekoh

2017/01/12 04:03

for (int a = 0; a < uIID.size(); a++) { System.out.print(uIIID.get(a) + "\t"); System.out.print(vIIID.get(a) + "\t"); System.out.print(star.get(a)); System.out.println(); } ちなみに65行目はこれの System.out.print(star.get(a)); の部分です インデックスが足りてないってことですかね うまくstarのとこがリストに追加されていないということでしょうか どう変えればいいのですかね…
kohekoh

2017/01/12 04:08

userID venueID star 5lq4LkrviYgQ4LJNsBYHcA , IuAPYzf3NSyfyXYgT46YVA , 4 5lq4LkrviYgQ4LJNsBYHcA , vaq5SJubaZjIoGhgkwxxUA , 4 5lq4LkrviYgQ4LJNsBYHcA , KiqWfXmMCklapGRedS8rtQ , 4 5lq4LkrviYgQ4LJNsBYHcA , QxHM7gQ7RcRHjnmr63xQnQ , 3 5lq4LkrviYgQ4LJNsBYHcA , bzDs0u8I-z231QVdIQWkrA , 4 5lq4LkrviYgQ4LJNsBYHcA , 4ZuYJjjFrqgyDEeYoizyIw , 4 5lq4LkrviYgQ4LJNsBYHcA , SHfUGBOznEtDhK6WbVrvIw , 4 5lq4LkrviYgQ4LJNsBYHcA , YppzR-sn8y15dmUd1lLcfw , 3 5lq4LkrviYgQ4LJNsBYHcA , WqdCrAhYSewDAom1qY-t_g , 4 5lq4LkrviYgQ4LJNsBYHcA , 60vZ8jCQ5yjNpDJBUeRIIg , 3 5lq4LkrviYgQ4LJNsBYHcA , 50nln4YPr0QDo_v1uBmHfg , 4 このようなデータです もっとデータ量は多いです
退会済みユーザー

退会済みユーザー

2017/01/12 04:28

そのデータの区切り文字に対して作り直したものを上記回答に追記します
kohekoh

2017/01/12 04:50

できました! ありがとうございます!
kohekoh

2017/01/12 04:51

追記もしていただけるとありがたいです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問