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

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

ただいまの
回答率

88.77%

java listの中からcharAtを使用し要素を取り出す

解決済

回答 4

投稿

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

funtekowa

score 11

Listの中にStringで宣言した文字列(数字)を入れ、charAtで要素の始まりを抜き出し、文字を数字に変換するプログラミングを行っています。
しかし、
charAt(int) を配列型 String[] で起動できません
式の型は配列型で int に解決済みのものである必要があります
とエラーがでます
どうコードを書けばいいのか分からない初心者なのでよろしくお願いします
Listではなく配列の場合はうまくいきました

Listを用いたコード

import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
public static void main(String[] args) {

String [] a = {"1234567894585584858"};
List <String> list1 =Arrays.asList(a);

int i;
int A = list1.size();

for (i = list1.size() - 1; i >= 0; i--) {
//ここでエラー
A[i] = a.charAt(i) - '0';
}

配列のコード

public static void main(String[] args) {
String a = "1254987562015987453";

int i;
int[] A = new int[a.length()];

for (i = a.length() - 1; i >= 0; i--) {
//要素を取り出して数字に変換
A[i] = a.charAt(i) - '0';
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • YabQ

    2019/05/03 04:58 編集

    回答するために必要な情報が足りないと感じたため,質問をさせてください.
    1. 配列のコードの動作を簡潔にまとめると,数字の羅列がString型で与えられており,それを1文字ずつint型にして配列に格納している.上のコードも似たような動作を行わせたい.ということでよろしいですか?

    2. Listのコードを順に見ていきましょう.
    String[] a = {"1234567894585584858"};は,配列に入れていますが,なぜですか?配列aの中身は"1234567894585584858"の1つのみです.
    List <String> list1 =Arrays.asList(a);をしても,list1の中身は[1234567894585584858]の1つのみです.
    int A = list1.size();はint[] A = new int[list1.size()];の間違いであると仮定しましょう.この配列に数字を入れていくということになりますが,それであっていますか?

    キャンセル

  • funtekowa

    2019/05/03 15:23

    それで合っています
    実はbigdecimalやbigintegerを使わずに桁が多い足し算や引き算を行おうとしています。配列だと足し算(同じ桁数同士のみ)しか自分は作れず、listなどを使えば要素の追加や削除が出来るので引き算や桁数が違う物同士での計算が出来るかもしれないと思い今回の質問をしました。一応配列で作成したコードを載せておきます。
    public static void main(String[] args) {
    String a = "1254987562015987453";
    String b = "1564203541236589741";
    int i;
    int j;
    int q;
    int count = 0;
    int[] A = new int[a.length()];
    int[] B = new int[b.length()];
    int[] c = new int[a.length()];
    for (i = a.length() - 1; i >= 0; i--) {
    A[i] = a.charAt(i) - '0';
    }
    for (q = b.length() - 1; q >= 0; q--) {
    B[q] = b.charAt(q) - '0';
    }
    for (j = A.length - 1; j >= 0; j--) {
    int C = A[j] + B[j];
    if (C < 10) {
    c[j] = C + count;
    count = 0;
    } else if (C >= 10) {
    C = (A[j] + B[j]) - 10;
    c[j] = C + count;
    count = 1;
    }
    }
    for (i = 0; i < A.length; i++) {
    System.out.print(c[i]);
    }
    {
    }
    }
    }

    キャンセル

  • jimbe

    2019/05/03 21:45

    javaコードは, 始めを「```java」の行, 最後を「 ```」の行として囲むと見易くなります.
    編集欄の上部にある "<code>" を押すと雛形が出ます.
    必要なコードはご質問を編集して追記して頂いたほうが良いです.

    キャンセル

回答 4

checkベストアンサー

+1

2019/05/04 21:30の内容
さて,次に引き算です.今回のプログラムは正の整数しか入力がない前提で書いていますが,残念ながら引き算は正の整数同士の計算でも負の数が答えになる場合があります.これに対する対処法は2つです.1つはa-bという計算において,a>bでしか計算を行わないようにするという方法.もう1つはa-bでa<bのとき,b-aをしてから先頭に-をつけて出力するという方法です.

後者のマイナスを先頭につけて出力する方法で今回は書いていきたいと思います.

1.入力された数字のどちらが大きいかを見分ける作業

大きい数字から小さい数字を引く作業をする以上,どちらの数字が大きいのかを確認する必要があります.
まず,桁数の違う2値の場合は,足し算同様に少ない桁数側の先頭を0埋めしたListを作成します.
次に,2つのListの先頭から順に数値をみていきます.どちらかの数字が大きい場合,そこで処理を中止し,大きい値が取得できた方のListを大,もう片方を小として保管します.具体例は以下の通りです.

113-123をさせたい.それぞれをlist1とlist2に入れる.
list1 = [1,1,3] list2 = [1,2,3]を先頭から見ていく
list1の0番目要素は1,list2の0番目要素は1,値は同じなので処理は続く
list1の1番目要素は1,list2の1番目要素は2,値はlist2の方が大きいので処理を終了

ここで,プログラムを書く都合上,list1を大,list2を小として扱いたいと思います.しかし,上のままではlist2が大になっているので入れ替えておきましょう.

List<String> tmp = list1;
list1 = list2;
list2 = tmp;


また,入れ替えたことはboolean型などで覚えておきましょう.最後に-をつけるかどうかで使います.

引き算の実装

list1-list2をする前提で書いていきます.また,先の説明から,list1>list2は成り立っている前提になります.
引き算において必要な情報は以下の通りです

  • 各Listの計算する桁の数字
  • 1つ上の位から繰り下がりしてくるか
  • 1つ下の位から繰り下がりされたか

ほぼ,足し算と同じですね.
よって以下のようになります.

list1=[1,0,0]からlist2=[0,9,5]を引く計算をします.

  • 各リストの後ろから数字を取ってきて(int a = 0, int b =5)
  • 下の位から繰り下がりされてないので,それに関する処理はせず
  • int c = a - b(c = -5)
  • a < bなので,上の位から繰り下げてくる(c += 10)->(c = 5)
  • 繰り下げてきたことをboolean型などで覚えておく(boolean borrow = true)
  • 下から2桁目を取ってくる(int a = 0, int b = 9)
  • 下の位から繰り下がりされているので,aの値から-1しておく(a--)->(a = -1)
  • int c = a - b(c = -10)
  • a < bなので,上の位から繰り下げてくる(c += 10)->(c = 0)
  • 繰り下げてきたことをboolean型で記憶
  • 下から3桁目を取ってくる(int a = 1, int b = 0)
  • 下の位から繰り下がりされているので,aから-1(a--)->(a = 0)
  • int c = a - b(c = 0)
  • a < bではないので繰り下げてくる処理なし
  • 終了

答えが[0,0,5]で5になりましたね.
お気づきかと思いますが,答えも先頭0埋めで返ってきます.
答えを表示するときなどは,先頭0梅を取ってから表示してあげてくださいね.

もし,95-100をしていたなら,最初にlist1とlist2の値を入れ替えたことを記録しているはずなので,答えの先頭に-をつけてから返してあげてください.


以下 2019/05/03 17:00以前の内容
やりたいことが理解でき,何をプログラムで実装したいのかわかりました.私も同じこと考えたことあります,実用性は二の次で自力で組み上げてみたいみたいな気持ちで書いていたことがあります,挫折しましたが(笑)

当時の気持ちを思い出しながら,私の方でも書いてみました.無事動くものが出来上がったので,ポイントさえ抑えれば実現はもちろんできます.いきなり答えを載せるのは何か違うなと感じたので,ヒントのようなものを書きたいと思います.

1.とりあえず足し算を実装

引き算の方がやはり難しいです.Listを使った足し算を実装してから,その要領で引き算を実装しましょう.

2.String->List<String>をするときに
String a = "123456";
List<String> list1 = Arrays.asList(a.split(""));

としてしまうと, list1.add("0");で要素の追加をするとエラーが発生します.これは,Arrays.asList()を使うと,Listの長さを固定長にしてしまうからです.上のコードの場合,list1は[1,2,3,4,5,6]となりますが,list1の長さは6で固定となるため,7個目の要素を入れることができません.これを回避する方法として,先にListだけ作成するという方法があります.具体的には以下の通りです

String a = "123456";
List<String> list1 = new ArrayList<String>();
list1.addAll(Arrays.asList(a.split("")));

このように,先にListをnew ArrayList<String>()で宣言しておくことによって,可変長,つまり長さ制限のないものが出来上がります.

足し算を実装するには
  1. 桁数の違う足し算などをするとき,少ない桁数の数字は先頭を0で埋めると扱いやすくなります.与えられる数字がそれぞれ,12345と6789のとき,Listの中身では[1,2,3,4,5]と[0,6,7,8,9]とする方が扱いやすいのです.これによって,forで各要素(数字)を見るときに,桁数の違いによるループ回数の差などを気にしなくてよくなります.
  2. 足し算に置いて必要なものは次の通りです.
  • 計算する桁の数字2つ
  • 1つ下の桁からの繰り上がりがあるか
  • 1つ上に繰り上げるか

先ほど例に出したList[1,2,3,4,5]と[0,6,7,8,9]をそれぞれlist1とlist2という名前とし,これらの足し算を例に挙げると,

  • list1と1ist2の後ろから要素を取り出してきて(int a = 5, int b = 9)
  • それぞれを足して(int c= a + b)
  • 1つ下からの繰り上がりはないので,c = c + 1の処理は飛ばして
  • 次の桁に繰り上がりするので,繰り上がりすることをboolean型などで覚えておく

といったことを繰り返して(for文)いけば足し算の完成です.
まだ注意するべきこともありますが,とりあえず足し算を作ってみましょう!
質問等あればまたどうぞ,最初から私が書いたやつ載せて!という場合も載せますので...


以下 2019/05/03 05:20以前の内容

私なりの回答を置いておきます.質問の意図と違う回答でしたら,またおっしゃってください.

import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
// ファイル名をlistcharAt2.javaにしたため
class java_listcharAt2 {
    public static void main(String[] args) {
        // String型配列を使い,かつArrays.asListを使う前提とすると,こういう書き方をしたかったのではないかという予想
        String[] a = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "4", "5", "8", "5", "5", "8", "4", "8", "5", "8" };
        // String型19の要素を含むListを作成したかったのではないかという予想
        List<String> list1 = Arrays.asList(a);

        int i;
        // for文の中でA[i]としていたので,Aは配列だと予想
        int[] A = new int[list1.size()];

        for (i = list1.size() - 1; i >= 0; i--) {
            // Listから要素を取ってくる時は,charAtは使えないので,とりあえずget.型をintにするために,Integer.parseInt(String)
            A[i] = Integer.parseInt(list1.get(i));
        }
        // 正しく格納されているかを確認するために追加.
        for (i = 0; i < A.length; i++) {
            System.out.println(A[i]);
        }
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/04 20:40

    足し算は「正の数値」を加算すること 
    引き算は「負の数値」を加算すること

    同じことなのになんでできないのかな?

    キャンセル

  • 2019/05/04 21:54

    上記投稿に引き算を加筆しました

    キャンセル

  • 2019/05/05 20:15

    引き算も無事実装出来ました!親切に教えてくれてありがとうございました!

    キャンセル

+1

どこから説明したらいいものかわからなかったので、とりあえずあなたがやりたかったであろうことを行うコードを書きます。ただ、果てしなく無駄な工程が入らざるを得ません…

public static void main(String[] args) {

    String[] a = "1234567894585584858".split("");
    List<String> list1 = Arrays.asList(a);
    int[] A = new int[list1.size()];

    for (int i = 0; i < a.length(); i++) {
        String s = list1.get(i);
        A[i] = s.charAt(0) - '0';
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/03 15:31

    回答ありがとうございます!参考にしてみます!!

    キャンセル

+1

ご質問の直接の回答ではありません.
加減算でしたら配列の大きさは +1 で済むのでは? と少々コードを書いてみました.
(負数は表現方法が定義されていませんのでサポートしていません.)

byte/short による 256/65536 進数や CPU サポートの BSD とかあったことを思い出しました.

public class Main {
  public static void main(String[] args) throws Exception {
    int[] a = toIntArray("1564203541236589741");
    int[] b = toIntArray("1254987562015987453");

    int[] c = addition(a, b);
    int[] d = subtraction(a, b);

    int width = max(a.length, b.length, c.length, d.length);
    System.out.println("  a="+toString(a, width));
    System.out.println("  b="+toString(b, width));
    System.out.println("a+b="+toString(c, width));
    System.out.println("a-b="+toString(d, width));
  }
  private static int[] toIntArray(String s) {
    int[] v = new int[s.length()];
    for(int i=0; i<s.length(); i++) v[i] = s.charAt(i) - '0';
    return v;
  }
  private static int[] addition(int[] a, int[] b) {
    int[] c = new int[Math.max(a.length, b.length) + 1];
    for(int ai=a.length-1, bi=b.length-1, ci=c.length-1, carry=0; ci>=0; ai--, bi--, ci--) {
      int v = (ai >= 0 ? a[ai] : 0) + (bi >= 0 ? b[bi] : 0) + carry;
      carry = v > 9 ? 1 : 0;
      c[ci] = v % 10;
    }
    return pack(c);
  }
  private static int[] subtraction(int[] a, int[] b) {
    int[] c = new int[Math.max(a.length, b.length) + 1];
    for(int ai=a.length-1, bi=b.length-1, ci=c.length-1, borrow=0; ci>=0; ai--, bi--, ci--) {
      int v = (ai >= 0 ? a[ai] : 0) - (bi >= 0 ? b[bi] : 0) - borrow;
      borrow = v < 0 ? 1 : 0;
      c[ci] = (v+10) % 10;
    }
    return pack(c);
  }
  private static int[] pack(int[] a) {
    if(a[0] != 0) return a;
    int i = 0;
    while(++i < a.length-1) if(a[i] != 0) break;
    int[] b = new int[a.length-i];
    System.arraycopy(a, i, b, 0, b.length);
    return b;
  }
  private static int max(int... values) {
    int v = values[0];
    for(int i=1; i<values.length; i++) if(v < values[i]) v = values[i];
    return v;
  }
  private static String toString(int[] v, int minWidth) {
    StringBuilder s = new StringBuilder(Math.max(v.length, minWidth));
    for(int i=v.length; i<minWidth; i++) s.append(' ');
    for(int e : v) s.append(e);
    return s.toString();
  }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

やりたいのはこういうことでしょうか?

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

public class Tera2 {
    public static void main(String[] args) {
        String str = "1234567894585584858";
        int len = str.length();
        List<Integer> nums = new ArrayList<Integer>();
        for (int i =0; i < len; i++) {
             nums.add(str.charAt(i) - '0');
         } 
         for (int i = 0; i < len; i++) {
             System.out.print(" " + nums.get(i));
         }
         System.out.println();
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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