プロが教える店舗&オフィスのセキュリティ対策術

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

public class test{

public static void main(String[] args){

int i = 0;
List〈String〉 trylist = new ArrayList〈String〉();
trylist.add(“Apple”);
trylist.add(“Orange”);
trylist.add(“Peach”);

HashMap〈Integer, String〉trymap = new HashMap〈〉();
for(int j: trylist){
trymap.put(i , trylist.get(j));
i ++;
}
for(int k : trymap){
System.out.println(trymap.get(k));
}
}
}

以上のプログラムをコンパイルすると
エラー:不適合な型:Stringをintに変換できません
for(int j: trylist)

エラー:for-eachは式のタイプに使用できません
for(int k : trymap)
期待値:配列またはjava.lang.Iterable
検出値:HashMap〈Integer,String〉
と表示されます。for文だと問題なく実行できるのですが拡張for文だとうまく行きません。
trylizt.sizeやtrymap.KeySetにかえたりもしましたがfor-eachは式のタイプに使用できませんやシンボルを見つけられませんとエラーがでます。

質問者からの補足コメント

  • うーん・・・

    回答ありがとうございます。
    もちろんそう考えてintをStringにも変えてみたのですが、不適合な型:Stringをintに変換できませんというちがうエラーがでたのでintに戻しました。
    またその際もうひとつのエラーはかわらずでてました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/04/09 01:50
  • どう思う?

    細かな指摘ありがとうございます。
    〈〉や“”などはスマホでこの質問を記入しているのでご容赦下さい、コードはしっかりと入力さしております。
    for(String j:trylist){
    trymap.put(i,j);
    i ++;
    }
    としてみたのですがエラーはでませんでしたがtrymapをgetで出力すると全てnullになっていたので値が上手く格納できていないようです。

    またvarはまだテキストにでてこないので使用しなくてもできる方法があると思うのですがいかがでしょうか?entrySetはでてました。

    よろしくお願いします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2021/04/09 18:34
  • trymap.put(i , j);
    としてます。

    No.4の回答に寄せられた補足コメントです。 補足日時:2021/04/10 18:40

A 回答 (4件)

No.3 の補足について



put 時に指定したキーで get を呼んでいますか?
今回の場合なら 0,1,2 の三つです。

総称(ジェネリック)が絡むと型名の記載量が多くなりがちなので、
作業用変数などは自動推測してくれる var で代用するのが一般的です。
それでも var を使ってはいけない特別な理由があるのならば、
JavaDoc 等を調べて適切な型をご自身で推測してください。

例)
1. entrySet() の戻り値は Set<Map.Entry<K,V>> と定義されている
2. 具象化すれば Set<Map.Entry<Integer,String>>
3. 個々の要素は Map.Entry<Integer,String>
4. 拡張 for 文の変数は Map.Entry<Integer,String> 型と決まる

参考)
https://docs.oracle.com/javase/jp/15/language/lo …
この回答への補足あり
    • good
    • 0

誤:〈String〉


正: <String> ← U+0060 と U+0062 で囲む

誤: “Apple”
正: "Apple" ← 両方とも U+0022 で囲む

誤:
for(int j: trylist){
trymap.put(i , trylist.get(j));
正:
for(String j: trylist){ ← String の配列なので String で受ける
trymap.put(i , j);

誤:
for(int k : trymap){
System.out.println(trymap.get(k));
正:
for(var k : trymap.entrySet()){ ← 拡張 for で処理できるオブジェに変換
System.out.println(k.getValue()); ← 値だけを取る
別解:
for(var k : trymap.values()){
System.out.println(k);

拡張 for 文は Iterable 型を処理するものなので、
Iterable を継承している ArrayList 型は処理可能。
継承していない HashMap 型は不可能だが、
継承しているオブジェへ変換することで、間接的に処理可能
参考)
https://docs.oracle.com/javase/jp/15/docs/api/ja …
https://docs.oracle.com/javase/jp/15/docs/api/ja …
https://docs.oracle.com/javase/jp/15/docs/api/ja …
この回答への補足あり
    • good
    • 0

>もちろんそう考えてintをStringにも変えてみたのですが、


>不適合な型:Stringをintに変換できません
>というちがうエラーがでたのでintに戻しました

戻しては駄目。

forはコレクションから要素をとり出しているのに
それをキーやインデックスが取得されると思い込んで
他のコートが書かれてます。これではエラーだらけは
当たり前です。

mapにforを直に使うのも駄目ですよ。
.values()とforで値を列挙するか
.keySet()とforでキーを列挙しましょう。
    • good
    • 0

trylistはArrayList<Sting> 型なんだから



for(String k: trylist) +{

じゃないと当然まわせないよね?

kにとり出されるのはインデックスじゃなくてリストの中味(要素)
そのものですよ?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!