• ベストアンサー

javaプログラミング

Javaを勉強中の者です。 以下のソースを実行すると ------------------------------------------- item[0] = {10, true, true} item[1] = {11, true, true} ------------------------------------------- となります。 しかし、 ------------------------------------------- item[0] = {10, true, false} item[1] = {11, false, true} ------------------------------------------- が期待する結果です。 public class test{ public static void main(String[] args) { boolean[] b = {false,false}; Item[] item = new Item[2]; item[0] = new Item(10 ,b); item[1] = new Item(11 ,b); item[0].setCandidate(0, true); item[1].setCandidate(1, true); b = item[0].getCandidate(); System.out.println("item[0] = {" + item[0].getNumber() + ", " + b[0] + ", " + b[1] + "}"); b = item[1].getCandidate(); System.out.println("item[1] = {" + item[1].getNumber() + ", " + b[0] + ", " + b[1] + "}"); } } public class Item{ private int number; private boolean[] candidate = new boolean[2]; public Item(int number, boolean[] candidate){ this.number = number; this.candidate = candidate; } public void setNumber(int num){ number = num; } public int getNumber(){ return number; } public boolean[] getCandidate(){ return candidate; } public void setCandidate(int num , boolean candi){ this.candidate[num] = candi; } } おそらくcandidate[]が上書きされてる? 説明がうまくできません… 期待通りの結果にするにはどうすればよいのでしょうか?

  • torum
  • お礼率61% (19/31)
  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

item[0] = new Item(10 ,b); item[1] = new Item(11 ,b); これで、item[0]とitem[1]のcandidateには独立した値があると 思われたのでしょうが、両方とも同じオブジェクトbを使っています。 b、item[0]のcandidate、item[1]のcandidate は全て同じデータです。 従って、どれを表示しても同じ値です。 因みに、bを変更すると、item[0]やitem[1]を修正しなくても、中の candidate は変化しています。尚、プリミティブ型で配列でない numberは各インスタンスで独立しています。 コンストラクタを変更して、以下のようにします。 public Item(int number, boolean[] candidate){   this.number = number;   this.candidate[0] = candidate[0];   this.candidate[1] = candidate[1]; } 配列の各要素はプリミティブ型なので、値はコピーされます。 コンストラクタに与えた変数bとクラス内のcandidateは別の データになります。

torum
質問者

お礼

配列もintやstringと同じように使えると考えてました。 勉強になりました。 ありがとうございます。

その他の回答 (1)

回答No.1

Item[] item = new Item[2]; item[0] = new Item(10 ,new boolean[]{false,false}); item[1] = new Item(11 ,new boolean[]{false,false}); Itemのインスタンス生成部分を↑のように変更してみてください。 元のソースがなぜうまくいかないのかというと、配列は参照型だからです。

参考URL:
http://www.javadrive.jp/start/array/index3.html
torum
質問者

お礼

うまくいきました! ありがとうございました。

関連するQ&A

  • javaで作成したゲーム→android用に変換

    お世話になっています。 前回こちらで、 1~25までの順番にタッチしていくというゲームのjavaのソースコードを教えて頂きました。 今回お聞きしたい内容が そのゲームに (1)秒単位のタイマーを付け、25個目の数字を押したらカウント終了 (2)androidアプリとして使用できるように変換 としようとしているのですが、いろいろと変換しなければいけないみたいで、 どちらもなかなかうまくいきません。 前回教えて頂いたコード import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; class MainFrame extends JFrame { private static final long serialVersionUID = 1L; private List<NumberdButton> numbers = new ArrayList<NumberdButton>(); private GridLayout grid = new GridLayout(5, 5); private boolean[] pressed = new boolean[5 * 5 + 1]; public MainFrame(String name) { super(name); setResizable(false); } public void setButtons(final Container pane) { initPressed(); initNumbers(); final JPanel p = new JPanel(grid); for (final NumberdButton b : numbers) { p.add(b); b.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (pressed[b.getNumber() - 1]) { b.setIcon(new ImageIcon("" + numbers + "_off.png")); b.setEnabled(false); pressed[b.getNumber()] = true; } } }); } pane.add(p, BorderLayout.CENTER); } private void initNumbers() { for (int i = 1; i < 26; i++) { numbers.add(new NumberdButton(i)); } Collections.shuffle(numbers); } private void initPressed() { for (int i = 0; i < pressed.length; i++) pressed[i] = false; pressed[0] = true; } public static void create(String name) { MainFrame frame = new MainFrame(name); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setButtons(frame.getContentPane()); frame.pack(); frame.setVisible(true); } } class NumberdButton extends JButton { private static final long serialVersionUID = 1L; private final int number; public NumberdButton(int number) { super(new ImageIcon("" + number + ".png")); this.number = number; } public int getNumber() { return number; } } public class pressbuttontoorder { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { MainFrame.create("PressButtonToOrder"); } }); } } androidのレイアウトはTableLayoutとtableRowでボタンを配置すればいいのかなと思い 配置しました。 TableLayout <TableRow1 <Button1~5 <TableRow2 <Button6~10 という風に25個ボタンを配置しています。 行き詰まっております。 どなたかやり方やコード等、教えて頂けたらありがたいです。 ご教授よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaのプログラムの質問です。

    Javaのプログラムについての質問です。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。  注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中に番号を振ってあります。 import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; import java.util.List; class LocalList implements List{  private int Count;  private String Data[];  private Iterator ite;  private ListIterator lite;  // コンストラクタ  void mylist(){   Data = new String[10];   Count = 0;  }  (1)  public boolean add(Object str){   if(Count >= 10){    return false;   }   Data[Count ++] = new String((String)str);   return true;  }  public void add(int i,Object str){  }        public boolean addAll(Collection c){   return false;  }        public boolean addAll(int i,Collection c){   return false;  }    (2)  public void clear(){   Count = 0;  }  public boolean contains(Object str){   return false;  }          public boolean containsAll(Collection c){   return false;  }  public boolean equals(Object str){   return false;  }    (3)  public Object get(int i){   return (i >= Count);  }  public int hashCode(){   return -1;  }  public int indexOf(Object str){   return -1;  }  public boolean isEmpty(){   return false;  }  public Iterator iterator(){   return ite;  }     public int lastIndexOf(Object str){   return -1;  }     public ListIterator listIterator(){   return lite;  }     public ListIterator listIterator(int i){   return lite;  }    (4)  public Object remove(int i){   return (i >= Count);  }    public boolean remove(Object str){   return true;  }         public boolean removeAll(Collection c){   return false;  }         public boolean retainAll(Collection c){   return false;  }    (5)  public Object set(int i,Object str){   return Data[i];  }    (6)  public int size(){   return Count;  }  public List subList(int i,int j){   return this;  }  public Object[] toArray(){   return Data;  }  public Object[] toArray(Object[] a){   return Data;  } } class Main {  public static void main(String[] args) {   mylist sub = new mylist();   sub.add("ビルドバーニングガンダム");   sub.add("ライトニングガンダム");   sub.add("ウイニングガンダム");   sub.add("ガンダムフェニーチェリナーシタ");   sub.add("R・ギャギャ");   for(int i = 0; i < sub.size(); i++){      System.out.println(sub.get(i));   }   // 改行   System.out.println();   // setメソッド   sub.set(1,"ガンダムエピオン");   for(int i = 0; i < sub.size(); i++){    System.out.println(sub.get(i));   }   // 改行   System.out.println();   // sizeメソッド   System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n");   // removeメソッド   sub.remove(1);   for(int i = 0; i < sub.size(); i++){       System.out.println(sub.get(i));   }   // clearメソッド   sub.clear();   System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです");    } } setメソッドとremoveメソッド以外は起動するのようになったのですが、この2つがうんともすんとも動きません。ジェネリクス型を使うという考え方もあるらしいのですが、ネットで調べてもピンと来ず寸詰まり状態になってしまっています。後少しだと思うのですが。。。。 どなたかご教授頂けないでしょうか?よろしくお願い致します。

  • java

    次のコード中の括弧内で下に示す11通りの各コードを実行した場合の実行画面を正確に答えよ。 class A{ public void func1(){System.out.println("A1");} public void func2(){System.out.println("A2");} } class B extends A{ public void func1(){System.out.println("B");} } class C{ public int x=0, y=1; } class D extends C{ public int x=2; public void func1(int x){System.out.println(x);} public void func2(int x){System.out.println(this.x);} public void func3(int x){System.out.println(super.x);} public void func4(int x){System.out.println(this.y);} public void func5(int x){System.out.println(super.y);} } class E{ public void func1(int n){ try{ System.out.println("E1"); int[] ary=new int[n]; System.out.println("E2"); }catch(NegativeArraySizeException e){ System.out.println("E3"); }finally{ System.out.println("E4"); } } } (1) A a=new A(); a.func1(); (2) A a=new B(); a.func1(); (3) B b=new B(); b.func1(); (4) B b=new B(); b.func2(); (5) D d=new D(); d.func1(3); (6) D d=new D(); d.func2(3); (7) D d=new D(); d.func3(3); (8) D d=new D(); d.func4(3); (9) D d=new D(); d.func5(3); (10) E e=new E(); e.func1(5); (11) E e=new E(); e.func1(-2); (1) A1 (2)B (3)B (4) A2 (5) 3 (6) 2 (7) 0 (8) 1 (9) 1 (10) E1E2E4(11) E1E3E4 と答えになるんですがなぜこうなるのかわかりません。教えてください

    • ベストアンサー
    • Java
  • Java の配列の中身は volatile ですか?

    たとえば(無理やりな例ですが)、クラスが private final boolean isReady[] = {false, false}; public void setIsReady(int index, boolean isReady) {  this.isReady[index] = isReady; } public void doTask(int index) throws Exception {  while (! isReady[index] ) {   Thread.sleep(1000);  }  doSomething(); } のようなメンバとメソッドを持っていて、setIsReady() と doTask() がそれぞれ別のスレッドから呼ばれるような場合、doTask() の中の while ループはちゃんと抜け出す事が保証されますか? (もちろん isReady[index] を true にセットするとして。) isReady が配列ではなければ private volatile boolean isReady = false; としておけば安心できるのですが、配列の中身を明示的に volatile に宣言 出来ないようなので。(出来るのならばやり方を教えてください。)

  • Javaのプログラミングで困っています。

    プロフィールを打ち込んで表示するプログラムを書いていました。 プロフィールの打ち込み後に画面に表示するのと同時にテキストファイルに書き出したいと思ったため、書いてみましたが、ファイルに書き込めず知識不足で困っています。 是非教えていただきたく書き込みをさせていただきました。 自分で書いたコードは書きになります。 import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; class Sample extends JFrame implements ActionListener{ /** * */ private static final long serialVersionUID = 1L; static JTextField name; static JTextField birth; static JTextField address; static JTextField mail; static JTextField number; JLabel label; public static void main(String args[]){ Sample frame = new Sample("profile"); frame.setVisible(true); } Sample(String title){ setTitle(title); setBounds(100, 100, 500, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); name = new JTextField("名前", 20); birth = new JTextField("生年月日", 20); address = new JTextField("住所", 40); mail = new JTextField("mail", 40); number= new JTextField("電話番号", 30); JButton button = new JButton("取得"); button.addActionListener(this); label = new JLabel(); p.add(name); p.add(birth); p.add(address); p.add(mail); p.add(number); p.add(button); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); contentPane.add(label, BorderLayout.SOUTH); try{ File file = new File("C:Users\\mattun\\Documents\\sample.txt"); if (checkBeforeWritefile(file)){ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); //ファイルに書き込む内容 pw.println("名前:"+name.getText()); pw.println("生年月日:"+birth.getText()); pw.println("住所:"+address.getText()); pw.println("mail:"+mail.getText()); pw.println("電話:"+number.getText()); pw.close();//ファイルを閉じる }else{ System.out.println("ファイルに書き込めません");//書き込み出来ない場合 } }catch(IOException e){ System.out.println(e); } } public void actionPerformed(ActionEvent e){ label.setText("<html>"+"名前:"+name.getText()+"<br>"+"生年月日:"+birth.getText()+"<br>"+"住所:"+address.getText()+ "<br>"+"mail:"+mail.getText()+"<br>"+"電話:"+number.getText()+"</html>"); } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } }

    • ベストアンサー
    • Java
  • javaのことで

    ---MainPanel.java--- import java.awt.Dimension; import java.awt.Graphics; import java.event.MouseEvent; import java.event.MouseListener; import javax.swing.JPanel; import java.util.Random; public class MainPanel extends JPanel implements MouseListener { public static final int WIDTH = 640; public static final int HEIGHT = 480; private static final int NUM_FILE = 4; private File[] file; private int prev; public MainPanel() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); file = new File[NUM_FILE]; for (int i = 0; i < NUM_FILE; i++) { file[i] = new File(i, this); } select(); addMouseListener(this); } private void clear() { for (int i = 0; i < NUM_FILE; i++) { file[i].delete(); } } private boolean check(int a, int b) { return a == b || a == prev || b == prev; } private void select() { Random rand = new Random(); int a, b; do { a = rand.nextInt(NUM_FILE); b = rand.nextInt(NUM_FILE); } while (check(a, b)); file[a].set(0, 0); file[b].set(file[a].getX() + file[a].getWith() + File.SPACE, 0); } public void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i < NUM_FILE; i++) { if (file[i].isSelected()) { file[i].draw(g); } g.drawString("ファイル" + (i + 1) + " … " + file[i].getCnt(), 0, HEIGHT * 3 / 4 + i * 15); } } public void mouseClicked(MouseEvent e) { int x = e.getX(); int y = e.getY(); for (int i = 0; i < NUM_FILE; i++) { if (file[i].isSelected()) { // 表示されていて // 画像内なら if (x > file[i].getX() && x < file[i].getX() + file[i].getWidth() && y < file[i].getY() && y > file[i].getY() + file[i].getHeight()) { file[i].count(); prev = i; clear(); select(); break; } } } repaint(); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } } フレームを用意してMainPanelを付加し,pack();してください.

  • Javaの戻り値のコード

    Java初心者です。returnの例文で分からない所があります。 (1)考え方として car1.setNumGas(1234, 20.5); の時点で void setNumGas(int n, double g) はvoid setNumGas(1234, 20.5)になり 次にgetNum( ) そのものを引っ張ってきているので、 ナンバーを調べました という文字まで一緒に引っ張らないのでしょうか? なぜ 次の行のretun文だけを拾うのですか? (2)returnのイメージがまだ出来ていません。 int number = car1.getNum(); とした時点で int getNum()  にジャンプし、 その中の returnを見つけ、 そしてreturnが numを使っている所をコードを下に降りて順に探しに行く というイメージで合ってますか? -------------------------------------------------------------------- return num; →よーし探しに行こう! まずdouble getGas()の中 → うーんない 次にvoid setNumGas(int n, double g) の中 { num = n;    →   お、あった! nは今1234だな、だから表示結果は1234 --------------------------------------------------------------------------- こんな認識で合ってますでしょうか? class Car { int num; double gas; int getNum() { System.out.println("ナンバーを調べました。"); return num; } double getGas() { System.out.println("ガソリン量を調べました。"); return gas; } void setNumGas(int n, double g) { num = n; gas = g; System.out.println("車のナンバーを" + num + "にガソリン量を" + gas + "にしました。"); } void show() { System.out.println("車のナンバーは" + num + "です。"); System.out.println("ガソリン量は" + gas + "です。"); } } class Sample6 { public static void main(String[] args) { Car car1 = new Car(); car1.setNumGas(1234, 20.5); int number = car1.getNum(); double gasoline = car1.getGas(); System.out.println("サンプルから車を調べたところ"); System.out.println("ナンバーは"+ number + "ガソリン量は" + gasoline + "でした。"); } }

    • ベストアンサー
    • Java
  • 初心者Javaの件。

    いつも大変お世話になりありがとうございます。 次の2つのコードは関係があるのでしょうか? 2つを合体させないとプログラムがエラーになるのでしょうか? 私は合体させないとプログラムが成立しないと思います。 アドバイスのほど宜しくお願い申し上げます。 コード1 public class Person { private int age; private double weight; private double height; public Person(int age, double weight, double height) { this.age = age; this.weight = weight; this.height = height; } public void show() { System.out.println("年齢は" + age + "体重は" + weight + "身長は"+ height +"です。" ); } } コード2 import java.io.BufferedReader; public class Sample3 { { public static void main(String args[]) throws Exception { person p[]; System.out.println("人数を入力してください。"); BufferedReader br = new BufferedReader(new inputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); p = new Person[num]; for(int i=0; i<num; i++) { } System.out.println("年齢を入力してください"); str = br.readLine(); int age = Integer.parseInt(str); P = new Person[num]; for(int i=0; i<num; i++){ System.out.println("年齢を入力してください"); str = br.readLine(); int age = Intger.parseInt(str); System.out.println("体重を入力してください"); str = br.readLine(); double weight = Double.parseDouble(str); System.out.println("身長を入力してください"); str = br.readLine(); double height = Double.parseDouble(str); p[i] = new person(age, weight, height); } for(int i=0; i<num; i++) { p[i].show(); } } }

    • ベストアンサー
    • Java
  • applet

    スレッドを使ってタイマーを作ろうと思っています。なぜか、ゆっくりとしかできないのですが・・。よろしくお願いします。 class TimerA implements Runnable { private boolean flg = true; private int time = 6000; public boolean isFlg() { return flg; } public int getTime(){ return time; } public void run() { for(;time > 0; time--) ; flg = false; System.out.println(time); } }

  • javaプログラミングについて

    ただいまjavaプログラム勉強中でhit&blowを制作しております。 public static void main(String[] args) { Scanner scan = new Scanner(System.in); Random rand = new Random(); int[] answer = new int[4]; int[] input = new int[4]; int[] Number = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }; int x = 10; for (int i = 0; i < 4; i++) { int select = (int) (Math.random() * x); answer[i] = Number[select]; Number[select] = Number[x - 1]; x--; } int count = 1; while (true) { System.out.println("4桁の異なる数値を入力"); int str_input = scan.nextInt(); // 代入 for (int i = 0; i < 4; i++) { input[i] = str_input; } // hit int hit = 0; for (int i = 0; i < 4; i++) { if (input[i] == answer[i]) { hit++; } } // blow int blow = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++){ if (i != j && input[i] == answer[j]) { blow++; } } } if (hit == 4) { System.out.println("4hit"); System.out.println("正解まで " + count + "回"); break; } else { System.out.println("Hit:" + hit + " Blow:" + (blow - hit)); count++; } } } } 数字が4桁で作っているのですが、数字や4桁以上を入力してしまった場合の表示は後にしようとして、先にhitとblowの判定を作ろうとしているのですが、上記で実行したところhitとblowの判定がされずhit:0blow:0と表示されてしまいます。解決策を教えてください。 自分で作ってみたものの、hit blowの判定方法があっているかも自信がないです。

    • ベストアンサー
    • Java

専門家に質問してみよう