71550


for文を重ねたことでxとyの配列の値が重複してしまいました。  
どうすればこの問題を改善できるでしょうか？

[![posxに100,200,300,400

posyに100,120,140,160が記録されています。](https://i.stack.imgur.com/WmOth.jpg)](https://i.stack.imgur.com/WmOth.jpg)

**posx.txt**

[code]

    100,200,300,400
    
[/code]

**posy.txt**

[code]

    100,120,140,160
    
[/code]

**問題のソースコード**

[code]

    size(500,200);
    
    String [] x=loadStrings("posx.txt");
    
    String [] y=loadStrings("posy.txt");
    
    if((x==null)||(y==null)) {
    
      println("ファイルの読み込みに失敗しました");
    
    }else{
    
      for(int i=0; i<x.length;i++) {
        for(int t=0; t<y.length;t++){
    
          ellipseMode(CENTER);
          ellipse(x[i],y[t],20,20);
        //plintln(x[i]);
        //plintln(y[t]);
        }
      }
    }
    
[/code]


CC BY-SA 4.0
2020-10-27T08:35:31.687
71538
2020-11-01T12:56:46.770
2020-11-01T12:56:46.770
32986
42389
question
java
円の座標がうまくいきません


スタックオーバーフローへようこそ！

画像の代替テキストに「posxに100,200,300,400
posyに100,120,140,160が記録されています。」と記述されていますので、loadStringsの戻り値は下記のようになるのでしょうか。

[code]

    loadStrings("posx.txt"); // 戻り値は new String[] {"100","200","300","400"};
    loadStrings("posy.txt"); // 戻り値は new String[] {"100","120","140","160"};
    
[/code]

その上でご質問のコードではxとyの配列の値を2重ループで回して、座標が重複することなくきれいに16個の円を描画しているように推測して回答します。  
(画像の黒い○のように描画しているイメージです)

[![実行時のイメージ](https://i.stack.imgur.com/Kt9tS.png)](https://i.stack.imgur.com/Kt9tS.png)

さてこれも推測ですが、「重複しないコード」とは、posxとposyのインデックスを同時に回して画像の赤い○のようなイメージで4つの円を描画することがゴールでしょうか。  
それならば2重ループを使わずに下記のコードで実現できます。

[code]

    int length = Math.min(x.length, y.length);
    IntStream.range(0, length).forEach(i -> ellipse(x[i], y[i], 30, 30));  // 質問の処理と見分けるため大きめの円にしました。
    
[/code]

processingを使っていない環境なので疑似コードですが、上記のコードを含むコード例です。  
mainメソッド以降は無視して問題ありません。

[code]

    import javax.swing.*;
    import java.awt.*;
    import java.awt.geom.Ellipse2D;
    import java.util.ArrayList;
    import java.util.stream.IntStream;
    
    public class TestMain extends JFrame {
    
        private void init() {
            String[] x = loadStrings("posx.txt");
            String[] y = loadStrings("posy.txt");
            // size(500, 200);
            size(500, 300);  // 円がはみ出るのでちょっと広げました。
    
            // 質問のコード
            for(int i = 0; i < x.length; i++) {
                for(int t = 0; t < y.length; t++) {
                    ellipseMode(CENTER);
                    ellipse(x[i], y[t], 20, 20);
                }
            }
    
            pen = Color.RED;  // 質問の処理と見分けるため線に色を付けています。
            // やりたいのはこっちですか？
            int length = Math.min(x.length, y.length);
            IntStream.range(0, length).forEach(i -> ellipse(x[i], y[i], 30, 30));  // 質問の処理と見分けるため大きめの円にしました。
        }
    
        public static void main(String[] args) {
            TestMain frame = new TestMain();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.imagePanel = new ImagePanel();
            frame.add(frame.imagePanel, BorderLayout.CENTER);
            frame.init();
            frame.setVisible(true);
        }
    
        // 以下は疑似コードなので無視して問題ありません。
        public ImagePanel imagePanel;
    
        private String[] loadStrings(String s) {
            // 手抜きコード
            if(s.equals("posx.txt")) {
                return new String[] {"100","200","300","400"};
            } else {
                return new String[] {"100","120","140","160"};
            }
        }
    
        private void size(int width, int height) {
            setSize(width, height);
        }
    
        private void ellipse(String x, String y, int width, int height) {
            int xPos = Integer.parseInt(x) - width / 2;
            int yPos = Integer.parseInt(y) - height / 2;
            imagePanel.addEllipse(xPos, yPos, width, height, pen);
        }
    
        private Color pen = Color.BLACK;
        private int CENTER = 0;  // dummy mock
        private void ellipseMode(int dummy) {} //dummy mock
    }
    
    // こちらも疑似コードなので無視して問題ありません。
    // 円の座標を取得して描画するパネル
    public class ImagePanel extends JPanel{
    
        public ArrayList<Ellipse2D.Double> ellipseList;
        public ArrayList<Color> penList;
    
        public ImagePanel() {
            ellipseList = new ArrayList<Ellipse2D.Double>();
            penList = new ArrayList<Color>();
        }
    
        public void addEllipse(int x, int y, int width, int height, Color pen) {
            Ellipse2D.Double  ellipse = new Ellipse2D.Double(x, y, width, height);
            ellipseList.add(ellipse);
            penList.add(pen);
        }
    
        protected void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            IntStream.range(0, ellipseList.size()).forEach(i -> {
                g2.setColor(penList.get(i));
                g2.draw(ellipseList.get(i));
            });
        }
    
    }
    
[/code]

蛇足ですが下記にご注意いただいてご質問を編集していただくと回答が集まりやすくなります。  
ぜひご参考になさってください。

  * 画像ではなくコピペで **単体動作する** コードを貼り付ける 
    * 画像でコードを貼り付けると、回答者が再現コードを作成したり誤字などのケアレスミスを探すのが難しくなります。
  * テキストファイルの中身など、回答者がコードから読み取れない情報もテキストで追記する 
    * 画像の説明文に情報を記述してもなかなか気付きにくいです。
  * 「何をもって改善としているのか」のゴールを分かりやすくする。(これはイメージ画像でも良いです)
  * 「javaのバージョンはX.X.Xで`processing`を使用しています」など環境やフレームワークを記述する


CC BY-SA 4.0
2020-10-28T03:22:10.417
71550
2020-10-28T03:22:10.417
9820
71538
answer