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

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

ただいまの
回答率

90.03%

Listの要素内の改行コードを置換したい

解決済

回答 2

投稿 編集

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

jin007

score 20

実現したいこと

格納されている要素の改行コードを「LF」⇒「CRLF」に変換したい

環境

Java5(古いので使えないメソッドが多数あり苦戦しています。。。)

考えたロジック

keyからValue値を取得して、「LF」が存在したら「CRLF」に置き換える
というのを考えたが使えないメソッドがあり断念。
(↑もし、1.5でもできるのある場合ご教授願いたいです)

keyもvalueもどっちからも「LF」が存在するか確認して存在する場合置き換える。

現状

recordObj.replace("\r", "☆");
でNoSuchMethodErrorが発生

コード

package dba;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class JapanFood {
public void Food() {

        List<HashMap<String, Object>> foodMap = null;

        foodMap = foodInfo();

        List<HashMap<String, Object>> returnMap = new ArrayList<HashMap<String, Object>>();

        System.out.println("【変換前】" + returnMap);

        for (HashMap<String, Object> recordObj : foodMap) {
            // 「LF」⇒「CRLF」に変換する
            recordObj.replace("\r", "☆");                //NoSuchMethodError
            recordObj.replace("\n", "☆");
            recordObj.replace("☆", "\r\n");
            returnMap.add(recordObj);
        }

        System.out.println("【返還後】" + returnMap);
    }

    public List<HashMap<String, Object>> foodInfo() {

         HashMap<String, Object> map = new HashMap<String, Object>();
         List<HashMap<String, Object>> returnMap = new ArrayList<HashMap<String, Object>>();

         map.put("HOKKAIDO","札幌・\n味噌ラーメン");
         map.put("AOMORI","青森・\n八戸汁");
         map.put("IWATE","盛岡・\nわんこそば");
         map.put("MIYAGI","仙台・\n牛タン");
         map.put("AKITA","秋田・\nきりたんぽ");
         map.put("YAMAGATA","山形・\nさくらんぼ");
         map.put("FUKUSHIMA","福島・\n喜多方ラーメン");
         map.put("IBARAKI","水戸・\n水戸納豆");
         map.put("TOCHIGI","宇都宮・\n餃子");
         map.put("GUNMA","前橋・\nこんにゃく");
         map.put("SAITAMA","さいたま・\nさつまいも");
         map.put("CHIBA","千葉・\n落花生");
         map.put("TOKYO","新宿・\nもんじゃ焼き");
         map.put("KANAGAWA","横浜・\n海軍カレー");
         map.put("NIIGATA","新潟・\n笹団子");
         map.put("TOYAMA","富山・\n白エビ");
         map.put("ISHIKAWA","金沢・\nきんつば");
         map.put("FUKUI","福井・\n水羊羹");
         map.put("YAMANASHI","甲府・\nぶどう");
         map.put("NAGANO","長野・\nりんご");
         map.put("GIFU","GIFU・\n飛騨牛");
         map.put("SHIZUOKA","SHIZUOKA・\nしらす");
         map.put("AICHI","NAGOYA・\n味噌カツ");

         returnMap.add(map);

         return returnMap;
     }
}

終わりに

文字列として配列の要素は持っています。

もし、これの他に簡単に作成できる場合それと併せてご教授願いたいです。

宜しくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • jin007

    2019/09/27 09:59

    keyは書き換えません。
    Valueの中にある「LF」を「CRLF」に書き換えたいというものになります。

    Objectになっているので不可能なのでしょうか?

    キャンセル

  • swordone

    2019/09/27 10:53

    instanceof Stringで判定すれば可能ですが、ちょっと意味が分かりません。
    もしやと思いますが、「DBから取得する際は数字が入っていることもある」というのは、「ただの文字列としての数字」であって、IntegerやDoubleに変換しているわけではないのでは?

    キャンセル

  • jin007

    2019/09/27 17:24

    DBからくるものはおそらく数字でも文字列の数字ということが分かりました。

    なので今回ここはObjectにしなくても全然よさそうです。
    ただ、他との依存関係がありObjectにせざるを得ないというものでした。

    私は数字が来ている=intも来るんだと考えてしまいましたがよく見ると数字は文字列として扱われていることに気づきました。


    DBから取得する際にObjectにする必要というのはどんな時が他に存在しますか?もしよければご教授願いたいです。

    キャンセル

回答 2

+1

中途半端な感じのする回答になってしまいましたが、
『Listの要素内の改行コードを置換したい』という質問自体には応えているので投稿します。

直接的原因

for (HashMap<String, Object> recordObj : foodMap) {
    // 「LF」⇒「CRLF」に変換する
    recordObj.replace("\r", "☆");                //NoSuchMethodError
    recordObj.replace("\n", "☆");
    recordObj.replace("☆", "\r\n");
    returnMap.add(recordObj);
}

HashMapにはreplaceというメソッドは存在しません。
文字通り そんな(Such)メソッド無いよ(No)エラー ですよね。

追記:
Map#replaceというメソッドはJava8以降ありますね。
ただこれもバリューを挿げ替えるもので、キーの更新はできません。

keyもvalueもどっちからも「LF」が存在するか確認して存在する場合置き換える。

解決方法

キーとバリューをそれぞれ取り出して置換を行えば良いです。
バリューの型はObjectなので型をチェックしStringにキャストするひと手間が必要です。

ただし、キーを編集するという発想はハッシュマップにそぐわないものです。実質無理です。()
新たにHashMapオブジェクトを作り、編集後のキー・バリューを与えてやって下さい。

HashMap<String, Object> newMap = new HashMap<String, Object>();
for(Map.Entry entry: recordObj.entrySet()) {
    Object value = entry.getValue();
    if(valueがStringのインスタンスでは無い) {
        必要な処理。質問文からは読み取れません。
        continue;
    }

    String newKey = entry.getKey().置換();
    String newValue = ((String)value).置換();

    newMap.put(newKey, newValue);
}

註: エントリーの削除 ⇒ 追加 という手順を踏めば可能。


前述の解決方法はやや場当たり的です。
データベースに明るく無いため思い付きの域を出ませんが、

  • そもそも値に改行文字が混ざるのは適切なのか?
  • 値を登録する際に使いやすいように改行コードを置換できないのか?
  • DB全体で改行コードを指定できないのか?あるいはDB側の機能で置換できないのか?
  • DBに値を登録する際、取り出す際に改行コードを指定できないのか?

という疑問があります。

追記・修正依頼でいくつか質問をしたのは、
『熟考したうえで、なお必要な処理なのか?』という部分が気にかかったからです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/26 19:02

    そもそも値に改行文字が混ざるのは適切なのか?
    >>値を登録する際に使いやすいように改行コードを置換できないのか?
    >>DB全体で改行コードを指定できないのか?あるいはDB側の機能で置換できないのか?
    >>DBに値を登録する際、取り出す際に改行コードを指定できないのか

    ⇒ごもっともでございます。
     このDBはデータがかなり古いものでして統一されていない為このようなことになっております。
     また、どうしてもLFをCRLFに置換しないといけない状況でしてそこのバックグラウンドを説明していないばかりにいくつか質問していただくことになり申し訳ございません。


    ```
    if(valueがStringのインスタンスでは無い) {
      必要な処理。質問文からは読み取れません。
      continue;
    }
    ```
    すみませんこの必要な処理とはどういうことでしょうか。

    キャンセル

  • 2019/09/26 19:04

    > DBから取得する際は数字が入っていることもある

    とのことでしたね。
    これがIntegerやDoubleでしたら、もちろん同じように置換処理はできませんので、別途何らかの処理を施してやる必要があります。

    単に無視したいだけなら newMap に登録する処理を書けば良いでしょう。

    キャンセル

  • 2019/09/26 19:13

    有難うございます。

    この後時間が取れないのでまた明日ご質問させていただく場合よろしければよろしくお願いいたします。

    キャンセル

checkベストアンサー

0

MapインタフェースのreplaceメソッドはJavaのバージョン8から追加されたメソッドですが、replaceメソッドの実装そのものは、以下と同じです。

if (map.containsKey(key)) {
     return map.put(key, value);
} else
     return null;
}

https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html#replace-K-V-

しかしこのメソッドは文字列を置換するのではなく、mapに対してもし指定したキーがあった場合はvalueの値に置き換えるものです。

さて今回行いたいことは文字列の置換ですから、Java5の言語仕様に沿うなら

        System.out.println("【変換前】" + foodMap);

        for (HashMap<String, Object> recordObj : foodMap) {
            Iterator<String> keys = recordObj.keySet().iterator();
            while(keys.hasNext()) {
                String key = keys.next();
                String value = (String)recordObj.get(key);
                String replaced = value.replace("\r", "☆").replace("\n", "☆").replace("☆", "\r\n");
                recordObj.put(key, replaced);
            }
        }

        System.out.println("【返還後】" + foodMap);

で変換がされるかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/27 17:21

    有難うございます。

    意味合いが同じコードを掲載してくれたおかげで理解が深まりました。
    とても勉強になりました!

    キャンセル

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

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