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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

4回答

3523閲覧

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

funtekowa

総合スコア11

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2019/05/02 19:20

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';
}

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

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

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

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

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

YabQ

2019/05/02 19: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 06: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 12:45

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

回答4

0

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

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

java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 int[] a = toIntArray("1564203541236589741"); 4 int[] b = toIntArray("1254987562015987453"); 5 6 int[] c = addition(a, b); 7 int[] d = subtraction(a, b); 8 9 int width = max(a.length, b.length, c.length, d.length); 10 System.out.println(" a="+toString(a, width)); 11 System.out.println(" b="+toString(b, width)); 12 System.out.println("a+b="+toString(c, width)); 13 System.out.println("a-b="+toString(d, width)); 14 } 15 private static int[] toIntArray(String s) { 16 int[] v = new int[s.length()]; 17 for(int i=0; i<s.length(); i++) v[i] = s.charAt(i) - '0'; 18 return v; 19 } 20 private static int[] addition(int[] a, int[] b) { 21 int[] c = new int[Math.max(a.length, b.length) + 1]; 22 for(int ai=a.length-1, bi=b.length-1, ci=c.length-1, carry=0; ci>=0; ai--, bi--, ci--) { 23 int v = (ai >= 0 ? a[ai] : 0) + (bi >= 0 ? b[bi] : 0) + carry; 24 carry = v > 9 ? 1 : 0; 25 c[ci] = v % 10; 26 } 27 return pack(c); 28 } 29 private static int[] subtraction(int[] a, int[] b) { 30 int[] c = new int[Math.max(a.length, b.length) + 1]; 31 for(int ai=a.length-1, bi=b.length-1, ci=c.length-1, borrow=0; ci>=0; ai--, bi--, ci--) { 32 int v = (ai >= 0 ? a[ai] : 0) - (bi >= 0 ? b[bi] : 0) - borrow; 33 borrow = v < 0 ? 1 : 0; 34 c[ci] = (v+10) % 10; 35 } 36 return pack(c); 37 } 38 private static int[] pack(int[] a) { 39 if(a[0] != 0) return a; 40 int i = 0; 41 while(++i < a.length-1) if(a[i] != 0) break; 42 int[] b = new int[a.length-i]; 43 System.arraycopy(a, i, b, 0, b.length); 44 return b; 45 } 46 private static int max(int... values) { 47 int v = values[0]; 48 for(int i=1; i<values.length; i++) if(v < values[i]) v = values[i]; 49 return v; 50 } 51 private static String toString(int[] v, int minWidth) { 52 StringBuilder s = new StringBuilder(Math.max(v.length, minWidth)); 53 for(int i=v.length; i<minWidth; i++) s.append(' '); 54 for(int e : v) s.append(e); 55 return s.toString(); 56 } 57}

投稿2019/05/03 14:46

編集2019/05/04 05:31
jimbe

総合スコア12646

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

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

0

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

java

1public static void main(String[] args) { 2 3 String[] a = "1234567894585584858".split(""); 4 List<String> list1 = Arrays.asList(a); 5 int[] A = new int[list1.size()]; 6 7 for (int i = 0; i < a.length(); i++) { 8 String s = list1.get(i); 9 A[i] = s.charAt(0) - '0'; 10 } 11}

投稿2019/05/02 21:41

swordone

総合スコア20651

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

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

funtekowa

2019/05/03 06:31

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

0

ベストアンサー

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/02 20:18

編集2019/05/04 12:53
YabQ

総合スコア35

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

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

funtekowa

2019/05/03 12:38

詳しく説明してくださってありがとうございます!とりあえず足し算実装をめざしてみます! あと java.util.Listなどをimportしようとすると「トークンに構文エラーがあります。構成の位置が間違っています」 とエラーが出ます 表示されたエラーで検索しても解決するような回答を見つけられなかったので解決方法を教えていただきたいです
YabQ

2019/05/03 12:42

エラーが発生しているプログラムを載せていただければ、エラー発生箇所を探してみます
funtekowa

2019/05/03 15:22

//トークンに構文エラーがあります。構成の位置が間違っています public class Taketa2 { import java.util.List; import java.util.ArrayList; import java.util.Arrays; //トークン "void" に構文エラーがあります。正しくは @ です //構文エラーがあります。"enum Identifier" を挿入して EnumHeader を完了してください //トークン "]" に構文エラーがあります。このトークンの後には :: を指定する必要があります public static void main(String[] args) 上記のエラーがでます
YabQ

2019/05/03 15:28 編集

import 3つを `public class Taketa2 {` の上に持っていくことでエラーが消えませんか?
funtekowa

2019/05/03 16:28

うっかりしてました packageとclassの間にimportを入れるという基本中の基本をわすれてました(笑) 解決しました ありがとうございます
YabQ

2019/05/04 03:00

では、頑張ってください!
funtekowa

2019/05/04 11:03

足し算は実装することが出来ましたが引き算がやっぱり分かりません
退会済みユーザー

退会済みユーザー

2019/05/04 11:40

足し算は「正の数値」を加算すること  引き算は「負の数値」を加算すること 同じことなのになんでできないのかな?
YabQ

2019/05/04 12:54

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

2019/05/05 11:15

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

0

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

java

1import java.util.ArrayList; 2import java.util.List; 3 4public class Tera2 { 5 public static void main(String[] args) { 6 String str = "1234567894585584858"; 7 int len = str.length(); 8 List<Integer> nums = new ArrayList<Integer>(); 9 for (int i =0; i < len; i++) { 10 nums.add(str.charAt(i) - '0'); 11 } 12 for (int i = 0; i < len; i++) { 13 System.out.print(" " + nums.get(i)); 14 } 15 System.out.println(); 16 } 17}

投稿2019/05/03 07:57

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問