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

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

ただいまの
回答率

90.83%

  • Java

    12532questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 553

kohekoh

score 103

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+1

数が少ないならuserID、venueIDそれぞれのListを作り、

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

import java.io.*;
import java.util.*;

class GOV {

    public static void main(String[] args) {
        HashSet<String> uID = new HashSet<>();
        HashSet<String> vID = new HashSet<>();
        HashMap<String, Integer> uSID = new HashMap<>();
        HashMap<String, Integer> vSID = new HashMap<>();
        ArrayList<String> uIID = new ArrayList<>();
        ArrayList<String> vIID = new ArrayList<>();
        ArrayList<Integer> uIIID = new ArrayList<>();
        ArrayList<Integer> vIIID = new ArrayList<>();
        ArrayList<Integer> star = new ArrayList<>();

        try (BufferedReader br = new BufferedReader(new FileReader("17.txt"))) {//入力ファイルパス

            String dat = "";
            dat = br.readLine();
            while ((dat = br.readLine()) != null) {
                String[] s = dat.split("[ ]+");

                uID.add(s[0]);
                vID.add(s[1]);

                uIID.add(s[0]);
                vIID.add(s[1]);

                star.add(Integer.parseInt(s[2]));

            }

        } catch (Exception e) {
        }

        int co = 0;
        for (String s1 : uID) {
            co++;
            uSID.put(s1, co);
        }
        co = 0;
        for (String s1 : vID) {
            co++;
            vSID.put(s1, co);
        }

        for (String s1 : uIID) {
            uIIID.add(uSID.get(s1));
        }
        for (String s1 : vIID) {
            vIIID.add(vSID.get(s1) + 100);
        }
        System.out.println("userID\tvenueID\tstar ");
        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();
        }

        try (BufferedWriter br = new BufferedWriter(new FileWriter("18.txt"))) {//出力ファイルパス
            br.write("userID\tvenueID\tstar ");
            br.newLine();

            for (int a = 0; a < uIID.size(); a++) {
                br.write(uIIID.get(a) + "\t");
                br.write(vIIID.get(a) + "\t");
                br.write(star.get(a) + "");
                if (a != uIIID.size() - 1) {
                    br.newLine();
                }
            }

        } catch (Exception e) {
        }

    }

}

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

import java.io.*;
import java.util.*;

class GOV {

    public static void main(String[] args) {
        HashSet<String> uID = new HashSet<>();
        HashSet<String> vID = new HashSet<>();
        HashMap<String, Integer> uSID = new HashMap<>();
        HashMap<String, Integer> vSID = new HashMap<>();
        ArrayList<String> uIID = new ArrayList<>();
        ArrayList<String> vIID = new ArrayList<>();
        ArrayList<Integer> uIIID = new ArrayList<>();
        ArrayList<Integer> vIIID = new ArrayList<>();
        ArrayList<Integer> star = new ArrayList<>();

        try (BufferedReader br = new BufferedReader(new FileReader("17.txt"))) {

            String dat = "";
            dat = br.readLine();
            while ((dat = br.readLine()) != null) {
                if (dat.length() == 0)
                    continue;

                String[] s = dat.split(",\t");
                s[0] = s[0].trim();
                s[1] = s[1].trim();
                s[2] = s[2].trim();

                uID.add(s[0]);
                vID.add(s[1]);

                uIID.add(s[0]);
                vIID.add(s[1]);

                star.add(Integer.parseInt(s[2]));

            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        int co = 0;
        for (String s1 : uID) {
            co++;
            uSID.put(s1, co);
        }
        co = 0;
        for (String s1 : vID) {
            co++;
            vSID.put(s1, co);
        }

        for (String s1 : uIID) {
            uIIID.add(uSID.get(s1));
        }
        for (String s1 : vIID) {
            vIIID.add(vSID.get(s1) + 100);
        }
        System.out.println("userID\tvenueID\tstar ");
        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();
        }

        try (BufferedWriter br = new BufferedWriter(new FileWriter("18.txt"))) {
            br.write("userID\tvenueID\tstar ");
            br.newLine();

            for (int a = 0; a < uIID.size(); a++) {
                br.write(uIIID.get(a) + "\t");
                br.write(vIIID.get(a) + "\t");
                br.write(star.get(a) + "");
                if (a != uIIID.size() - 1) {
                    br.newLine();
                }
            }

        } catch (Exception e) {
        }

    }

}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/11 23:39

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

    キャンセル

  • 2017/01/12 12: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 13: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
    という出力が出たコードです
    何のデータを入れたかにもよるのかも知れません
    どのようなデータを入れたのでしょうか


    キャンセル

  • 2017/01/12 13: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のとこがリストに追加されていないということでしょうか
    どう変えればいいのですかね…

    キャンセル

  • 2017/01/12 13: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 13:28

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

    キャンセル

  • 2017/01/12 13:50

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

    キャンセル

  • 2017/01/12 13:51

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

    キャンセル

0

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

relayUserVnue.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;

class relayUserVnue{
  public static void main(String args[]){

// 会場IDのハッシュ(連想配列)を用意
    HashMap<String,Integer> venueIdMap = new venueMap<String,Integer>();

    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,int> userIdMap = new HashMap<String,int>();

    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("UserVenueStar.txt"))) {
        String strData = reader.readLine();
        String[] strItem;
        int userId, venueId, star;
        System.out.println("userID venueID star");
        while (strData != null){
            strData = reader.readLine();
            strItem = strData.split("  ");
            if (userIdMap.containsKey(strItem[0])){
              userId = userIdMap.containsKey(strItem[0]);
            }else{
              userId = 0;
            }

            if (venueIdMap.containsKey(strItem[1])){
              venueId = venueIdMap.containsKey(strItem[1]);
            }else{
              venueId = 0;
            }

            star = sstrItem[2];
            System.out.println(userId + "      " + venueId + "      " + star);
        }
    } catch (Exception e) {
    }
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/12 11:06

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

    キャンセル

  • 2017/01/12 13: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) {
    }
    }
    }

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Mapのすべての要素をループで表示したい

    キーに品番、値に商品名をセットしたHashMapクラスがあるのですが、 HashMapの全ての要素を以下のようなイメージで表示させたいです。 ループ処理をどう書けばいいのでしょうか

  • 解決済

    javaでBeanプロパティの値をログ出力する簡単な方法

    javaで、あるBeanのプロパティの中身の値をログ出力するようなコードを書いているのですが、プロパティ数が増えるとコードの量も多くなってしまい面倒に感じています。 例えばこんな

  • 解決済

    Enumの使い方

    プログラム中にあるマジックナンバーを理解できる形に直そうと思いEnumを使おうとしているのですが、Enumの使い方がわかりません。 例えばプログラムで if (sum >= 50)

  • 解決済

    jspでservletのログインユーザー名を使用したいです。<%=Account.getUserId...

    どうぞよろしくお願いします。 - - - - - loginOK.jsp ここで、赤波線が出てします。 <%@ page language="java" contentType=

  • 解決済

    Javaを用いて、ある行から文字を抽出したい

    javaを用いた実装についての質問です テキストファイルがあり、行からIDを抽出して、 ファイルに書き込みたいのですがどうすればよいでしょうか 例えば、 userI

  • 解決済

    javaのことで聞きたい

    package model; import dao.FollowDAO; public class FollowLogic { public void execut

  • 受付中

    javaがわかりません

    前提・実現したいこと ここに質問したいことを詳細に書いてください. javaがわかりません  製造単価70円、販売単価100円 120個作ったときの利益を求める。 個数 9

  • 解決済

    JPQL で表すと SQL

    @Query(value = "SELECT * FROM PROFILE INNER JOIN FAVORITE ON PROFILE.USER_ID = FAVORITE.FA

同じタグがついた質問を見る

  • Java

    12532questions

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