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

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

ただいまの
回答率

90.34%

  • Java

    14411questions

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

  • 配列

    546questions

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

Object配列をintに変換するには?

解決済

回答 2

投稿

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

Momomo.

score 16

作りたいプログラム:
ユーザーが選んだ「名前、名字、残高が書かれたファイル」を配列リストに保存します。
それからCheckWriterというクラスを使って残高をアルファベットで表示するというプログラムを書いています。

例)Colin Emblow $294,648 
これを
Colin Emblow $294,648 two hundred ninety four thousand six hundred forty eight
と表示させたいのです。

CheckWriterクラスにArrayListから残高(money)だけを抜き取って、それをintに変換してからparameterとして渡したいのですが、Objectからintに変換できないとエラーが出ます。
また、テキストファル内の残高には”$”が数字の前にあるのでそれがエラーの1つの原因かと思い、splitを使って"$"以降の数字をintに変換したいのですが、どうやらsplitが使えないようで困っています…

このArrayListから残高(money)だけを取り出し、intに変換してCheckWriterクラスのParameterとして渡すにはどうすれば良いでしょうか?

読み込みたいテキストファイル:
イメージ説明

実際に書いたプログラム:
1)Main Program

import java.util.ArrayList;
import java.beans.FeatureDescriptor;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.swing.JFileChooser;

public class MainProgram {
    public static void main(String[] args) throws IOException{
        Scanner sc = new Scanner(System.in);

        System.out.println("Choose from the menu below");
        System.out.println("Menu:\na) Open a file\nb) Save the file\nc) Exit");
        String menu = sc.next();

        switch(menu.toLowerCase()){
        case "a": //Open file
            JFileChooser jfc = new JFileChooser();
            int returnValue = jfc.showOpenDialog(null);
            if (returnValue == JFileChooser.APPROVE_OPTION){
                File selectedFile = jfc.getSelectedFile();
                TheFileReader fr = new TheFileReader();
                display(fr.readFile(selectedFile));
            }
            break;

        case "b": //Save file
            JFileChooser jf = new JFileChooser();
            jf.setDialogTitle("Specify a file to save");
            int userSelection = jf.showSaveDialog(null);

            //writeToFile(userSelection);
            break;

        case "c": //Terminate program
            System.out.println("-- End --");
            break;

        default:
            System.out.println("Invalid input.");
        }
    }

    private static void display(ArrayList<Employee> list){
        CheckWriter cw = new CheckWriter();
        String[] sp = new String[list.size()];
        for(int i=1; i<list.size(); i++){
            String tmp = String.valueOf(list.get(i));
            for(int j=0; j<list.size(); j++){
                sp[j] = tmp.split("$");
                cw.convertToWord(Integer.parseInt(tmp));
            }
        }
        for(int i=0; i<list.size(); i++){
            System.out.printf("%-15s %15s %-15d",list.get(1));
        }
    }

    private static void writeToFile(ArrayList<Employee> list, String[] moneyInWord) throws IOException{
        JFileChooser jf = new JFileChooser();
        jf.setDialogTitle("Specify a file to save");
        int userSelection = jf.showSaveDialog(null);

        if (userSelection == JFileChooser.APPROVE_OPTION) {
            File fileToSave = jf.getSelectedFile();
            System.out.println("Save as file: " + fileToSave.getAbsolutePath());
            FileWriter fw = new FileWriter(fileToSave,true); //boolean

            PrintWriter pw = new PrintWriter(fw);
            for(int i=0; i<list.size(); i++){
                pw.println(list.get(i)+" "+moneyInWord[i]+"\n");
                pw.close();
                fw.close();
            }
    }
}
}

2)TheFileReader

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileSystemView;

public class TheFileReader {

    public static ArrayList<Employee> readFile(File list) {  //  I need to return an arrayList, so return al at line 49

//        cause my constructor name is Employee
        ArrayList<Employee> al = new ArrayList<Employee>(); // al = arraylist

        JFileChooser jfc = new JFileChooser();
        Employee e;// create an empty employee 

            String[] temp; // temp array for storing some data
            Scanner s;
            try {
                s = new Scanner(new FileReader(list));// read a file that was inputed by user.
                while (s.hasNextLine()) {
                    temp = s.nextLine().split(",");
                    e = new Employee(temp[0],temp[1],temp[2]);
                    al.add(e); // cause I need to input an employee constructor to my arraylist, e is my constructor name
                }
                s.close();

            } catch (FileNotFoundException ee) {
                System.out.println("error: " + ee);
            }        
        return al;
    }
}

3)CheckWriter

public class CheckWriter {

        String[] units = {
                "",
                "one",
                "two",
                "three",
                "four",
                "five",
                "six",
                "seven",
                "eight",
                "nine",
                "ten",
                "eleven",
                "twelve",
                "thirteen",
                "fourteen",
                "fifteen",
                "sixteen",
                "seventeen",
                "eighteen",
                "nineteen"
        };

        String[] tens = {
                "",
                "",
                "twenty",
                "thirty",
                "fourty",
                "fifty",
                "sixty",
                "seventy",
                "eighty",
                "ninety",        
        };

        public String convertToWord(int amount){

             if (amount < 0) {
                    return "minus " + convertToWord(-amount);
                }

                if (amount < 20) {
                    return units[amount];
                }

                if (amount < 100) {
                    return tens[amount / 10] + ((amount % 10 != 0) ? " " : "") + units[amount % 10];
                }

                if (amount < 1000) {
                    return units[amount / 100] + " hundred" + ((amount % 100 != 0) ? " " : "") + convertToWord(amount % 100);
                }

                if (amount < 1000000) {
                    return convertToWord(amount / 1000) + " thousand" + ((amount % 1000 != 0) ? " " : "") + convertToWord(amount% 1000);
                }

                if (amount < 1000000000) {
                    return convertToWord(amount/ 1000000) + " million" + ((amount % 1000000 != 0) ? " " : "") + convertToWord(amount % 1000000);
                }

                return convertToWord(amount / 1000000000) + " billion"  + ((amount % 1000000000 != 0) ? " " : "") + convertToWord(amount % 1000000000);
            }
    }

4)Employee

public class Employee {
    private String fName;
    private String lName;
    private String money;

    public void setFName(String fName){
        this.fName = fName;
    }

    public void setLName(String lName){
        this.lName = lName;
    }

    public void setMoney(String money){
        this.money = money;
    }

    public String getFName(){
        return fName;
    }

    public String getLName(){
        return lName;
    }

    public String getMoney(){
        return money;
    }

    public Employee(){ //default
        fName = "Dont know";
        lName = "Dont know";
        money = "0";
    }

    public Employee(String m){
        money = m;
    }

    public Employee(String fName,String lName,String money) { // three parameters
        this.fName = fName; // put user input to your fName in your constructor 
        this.lName = lName; // same as above, but different value here(lName)
        this.money = money;    // same as above, but different value here(money)
    }

    @Override
    public String toString() {
        return String.format(
            "%s\t%s\t%s\n", fName, lName, money
        );
    }


}

エラー:
現在このプログラムを実行し、メニューで
a)Open a file
を選択した場合にはこのようなエラーが現れます。

イメージ説明

ネットでエラーの意味も検索しましたし、splitやsubstringなどのメソッドも試しましたがうまくいかず困っています。
どうか解決方法がわかるかた、助けていただけませんか?
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Momomo.

    2018/06/20 15:10

    最後に2つだけ言わせていただくと、過去に質問した際に海外の大学で授業を受けていること、先生が質問になかなか答えてくださらず疑問点が疑問点のままで困っていることなどの状況説明を書いたことがあります。するとある回答者の方から「そんなことは聞いていない」と言われてしまいました。それ以来プログラミング以外のことは書いても不必要だと見なされると思って書かなくなりました。書いても書かなくてもきっとどなたかには「指摘」されるのだと思います。また、このように丁寧に私が改善すべき点を挙げてくださればこちらも「次回は気をつけよう」という気持ちになれますが、「良くないです」「あなたの一挙手一投足を見ている人はここには誰もいません」「ちゃんと読んでなさそうです」という書き方をされてしまうと、どうしても批判されている、怒られているという気持ちになります。私も回答者さまたちの気持ちが分かっておらず質問の仕方に改善点がたくさんあるようで申し訳なかったです。しかし回答者さまたちも質問者が批判されたと捉えるようなコメントではなく分かりやすく改善すべき点を指摘してくだされば質問者側も(きっとこのように質問の仕方に改善が必要な利用者は私だけではないと思います)気持ちよく改善することができると思いますしお互い気持ちが良いのではないでしょうか…?

    キャンセル

  • Momomo.

    2018/06/20 15:12

    今後こちらのサイトで質問させていただくことがあればご指摘いただいた点を参考に質問の仕方を改善します。前回の長文内で分かりやすく改善点を教えていただきありがとうございました。

    キャンセル

  • mts10806

    2018/06/20 15:21 編集

    文字では気持ちが汲み取れないので難しいところですよね。他の人は知りませんが、私はルールに則った指摘しかしていませんので、その辺は汲み取っていただければ。その辺りは既に書いていて言及されないので「読んでなさそう」と判断しています。思い込みでもなんでもありません。もちろん淡々とコメントしているので誤解を生むこともないわけではないですが、その都度認識を確認すれば良いと思っています。「そんなこと聞いてない」というのはどういう状況でそのような指摘をされたか知りませんが、「サポートセンターとして利用しようとしているのではない」「学校の課題や宿題の代行を頼もうとしているのではない」「仕事の依頼をしようといるのではない」というのを”誤解させないためにも” 自身が特殊な環境化であることは前提として質問本文に最初に書いておいて良いかと思いますよ( https://teratail.com/help/question-tips#questionTips1-1 >あなたがそのようなつもりで質問しているのだと他のユーザーから誤解されないように )。後から出されたら今回・またはそのときのように「そんなこと聞いてない」と言われるのは当然です。「前提条件」として必要な情報と、私はMomomo. さんの状況を聞いて思いました。

    キャンセル

回答 2

checkベストアンサー

+3

単純に、strigの中から'$' と','を削除して、数字だけ残して変換したらどうでしょう?
・・・私ならstringを受け取って、intを返すクラスを作りますが・・・
あと、intの範囲は超えないのですよね?
「追記」
jvaは詳しくない&netbeabsでの実行結果ですが・・・

/*
 */
package javaapplication1;

/**
 */
public class JavaApplication1 {
    //
    private static int s2i(String str){
        int a=0;
        //
        for( int i= 0; i < str.length(); i++){
            char ch= str.charAt(i);
            if(  ch == '$' || ch == ','){
                continue;
            }
            a *= 10;
            a += ch - '0';
        }

        return a;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        System.out.println(s2i("$41,713,889"));
    }

}


run:
41713889

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/20 06:50

    stringを受け取ってintを返すというのは、ArrayListに保存せずにということでしょうか、、、?
    初心者なのでなかなか理解できず申し訳ないです。
    intの範囲を超える可能性もあるのですが、超えた場合にどうすれば良いかわからないのでとりあえずintの範囲内で変換するプログラムを書いています。

    キャンセル

  • 2018/06/20 07:03

    int の範囲を超えるならより広い範囲の プリミティブ型の数値を使えばいいだけだろう

    キャンセル

  • 2018/06/20 07:05

    それでも無限にはなりませんよね?
    もしも単位がquadrillionだった時にCheckWriterクラスを含めどうすれば良いかわからないのでまずはじめにintの範囲でプログラムを完成させたいのです。

    キャンセル

  • 2018/06/20 07:31 編集

    アメリカの国家予算ですら及ばない金額を扱うのでしょうか?


    (アメリカ国家予算 円計算) 2.10*(10^12)
    (プリミティブ型上限疑似値)1.79*(10^308)

    こっちにした方がわかりやすいか

    キャンセル

  • 2018/06/20 07:38

    私もquadrillionは大きすぎると思うのですが、学校の先生がどんな単位でも変換できるようにと。。。どんな意図かはわかりませんが(>_<)

    キャンセル

  • 2018/06/20 07:40

    先生曰く数値ではなくStringとして考えればどんなに大きな数字でもアルファベットに変換できるだろうと。。。

    キャンセル

  • 2018/06/20 07:45

    わかりやすく書き直してくださってありがとうございます!

    キャンセル

  • 2018/06/20 07:48

    講師も講師なのか、

    doubleの扱える上限は「無量大数」以上「無限大未満:疑似地として MAX_VALUE を超える値は無限大とする」

    まあ3桁区切りと [thousand,million,billion,quadrillion ...]の関係性がわかってれば short でいけるんだけどね

    キャンセル

  • 2018/06/20 07:54

    3桁ずつに分けて単位をあとで足したら良いというわけですよね…?
    挑戦してみます!

    キャンセル

  • 2018/06/20 11:16

    それでも3桁ごとの単位は用意しなければいけないので、いずれにせよ無限には対応できない。

    キャンセル

  • 2018/06/20 11:34

    あーたしかに
    10^123 のつぎ10^153 だ・・・ これ以降30ずつアップ (Quadragintillion,Quinquagintillion)
    10^603のつぎは10^903 だ・・・ これ以降300ずつアップ (Ducentillion,Trecentillion)
    10^3003 (Millinillion) で打ち止めか

    キャンセル

  • 2018/06/20 14:48 編集

    BigIntegerだって、一応上限(2^Integer.MAX_VALUE)ありますからね…
    (10進数で約7億桁)

    キャンセル

  • 2018/06/20 14:52

    BigInteger であふれる通貨でってどこのジンバブエだろう・・・

    キャンセル

  • 2018/06/20 15:15

    気づかないうちにコメント欄が知らない言葉で溢れていました^^;
    検索しますね。勉強させていただきありがとうございます。
    (次に先生に会った時に「BigIntegerで溢れる国なんて無いですよ」と言ってみようと思います!)

    キャンセル

  • 2018/06/20 15:18

    cateyeさん、一番早い回答をありがとうございました。
    charを使う方法は考えつきませんでした。
    (ずっとStringで$をexcludeする方法ばかり考えていました。。。)
    自分と違う見方を知れて大変勉強になりました!

    キャンセル

  • 2018/06/20 15:19

    asahina1979さん、swordoneさん、コメント欄でのディスカッションを読んでこちらも良い勉強になりました。

    キャンセル

  • 2018/06/20 16:00

    どうもc++が抜けないので^^; javaらしくないコードかもしれませがお役に立ててよかったです。

    キャンセル

+2

エラーの原因は、Stringの配列をStringに変換しようとしていること。それをやっているのがdisplayメソッド内のここ。

sp[j] = tmp.split("$");


String#splitの結果はStringの配列で、代入先であるsp[j]はString配列の一要素、つまりStringです。代入の型が合ってないのでエラーになります。

ってか、コンパイルエラーなんだから実行するときに何かしら警告が出たはずですが、無視して実行したんでしょうか…?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/20 15:27

    分かりやすい説明をしてただきありがとうございました。
    コンパイルエラーの件ですが、splitを使ったら「Stringの配列をStringに変換できない」エラーが出て、配列をStringに変える方法を示唆されました。(Eclipse内で)
    それに従いStringに変えるとまた別のエラーが出て、splitをsubstringに変更して試してもまたコンパイルエラーで、他にもStackOverflowに書いて会った方法を試したりしましたがまた別のエラーが出て、数時間たっても解決できなかったので、自分で書いたプログラムをそのまま実行しエラーのスクリーンショットを撮って投稿したのです。
    (上級者の方はエラー表示を見ただけでおおよそエラーの理由がわかるのでどんなエラーか載せるようにとの記述を読みましたので、それに従ってみたのです。。。)

    キャンセル

  • 2018/06/20 16:17 編集

    各々のメソッドが何をしているのか理解しないまま、あれこれいじってもまったく意味がありませんよ。
    Eclipseは「とりあえずここのエラーをなくすための提案」をしているに過ぎず、ロジックがどうとか要件がどうとかは一切考慮していません。
    (Eclipseが提案したという配列をStringに変える方法も、大方toString()をつけるとかそういうものだったのではないですか?)
    結局、「何をどうしたいか」の方向性が固まっていないため、そんな変なことになっているのです。

    キャンセル

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

  • Java

    14411questions

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

  • 配列

    546questions

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