0

.txt次の形式のデータ(座標)を含むファイルがあります

0   1     12.56
2   0     -56.2
1   2     78.2
0  -56.2  2
-2  8     0

次のコードを使用して、このデータをインポートしました。

  public ArrayList<Point3d> loadFile(String filename) {
    ArrayList<Point3d> words = new ArrayList<Point3d>();
    try {
        Scanner chopper = new Scanner(new File(filename));
        while (chopper.hasNext()) {
            double x=chopper.nextDouble();
            double y=chopper.nextDouble();
            double z=chopper.nextDouble();
            Point3d p=new Point3d(x, y, z);
            words.add(p);
            // just calling nextLine will cause an exception at the end of the file unless you have an blank line there on purpose, so this makes sure it does
        }
        chopper.close();
    } catch (Exception e) {
       System.out.println(e);
    }
    return words;
}

インポートは正常に機能しています。負の座標と正の座標を分離したいこともわかっています。また、対応するインデックス値を追加したいと考えています。

最後に、次の方法で結果が必要です。

結果 :

 positiveList= {{0,0,1,12.56},{2,1,2,78.2}}

 negativeList={{1,2,0,-56.2},{3,0,-56.2,2},{4,-2,8,0}}

これどうやってするの。

4

3 に答える 3

1

ここでの私のソリューションではMapデータ構造を使用していますが、必要ListsLists応じて 2 つ作成できます。

whileループの外側に次を追加します。

Map<Integer, Point3D> negativeCoord = new HashMap<>();
Map<Integer, Point3D> positivetiveCoord = new HashMap<>();
int currentIndex = 0;

そしてその中に:

Point3d p = new Point3d(x, y, z);
if(x < 0 || y < 0 || z < 0) {
    negativeCoord.put(currentIndex, p);
} else {
    positiveCoord.put(currentIndex, p);
}
currentIndex++;
于 2013-09-30T08:00:40.307 に答える
0

これは、順序を知らずに、ポジティブとネガティブだけを持つための解決策です。

public ArrayList<Point3D> getPositives(ArrayList<Point3D> points) {
    ArrayList<Point3D> positives = new ArrayList<>();
    for(Point3D next : points) {
        if(next.getX() >= 0 && next.getY() >= 0 && next.getZ() >= 0)
            posivites.add(next);
    }
    return positives.
}

public ArrayList<Point3D> getNegatives(ArrayList<Point3D> points) {
    ArrayList<Point3D> negatives = new ArrayList<>();
    for(Point3D next : points) {
        if(next.getX() < 0 || next.getY() < 0 || next.getZ() < 0)
            negatives.add(next);
    }
    return negatives.
}

シナリオによっては、情報用に独自のコンテナー クラスを用意するのが賢明な場合があります。

public class PointContainer {
    public final Point3D point;
    public final int order;
    public PointCoordinates (Point3D p, int order) {
        this.point = p;
        this.order = order;
    }
    public boolean isNegative() {
       return point.getX() < 0 || point.getY() < 0 || point.getZ() < 0;
    }
}

リストにそれを入力します。

  public ArrayList<Point3d> loadFile(String filename) {
    ArrayList<PointContainer> words = new ArrayList<PointContainer>();
    try {
        Scanner chopper = new Scanner(new File(filename));
        for (int line = 0; chopper.hasNext(); line ++) {
            double x=chopper.nextDouble();
            double y=chopper.nextDouble();
            double z=chopper.nextDouble();
            Point3d p=new Point3d(x, y, z);
            PointCoordinates pc = new PointCoordinates(p, line);
            words.add(pc);
            // just calling nextLine will cause an exception at the end of the file unless you have an blank line there on purpose, so this makes sure it does
        }
        chopper.close();
    } catch (Exception e) {
       System.out.println(e);
    }
    return words;
}

そうすれば、必要なすべての情報をすぐに使用できるようになります。

于 2013-09-30T08:00:46.927 に答える
0

次のように、ファイルをロードした後にこれを行うことができます。

Map<Integer, Point3d> positiveList = new java.util.HashMap<Integer, Point3d>();
Map<Integer, Point3d> negativeList = new java.util.HashMap<Integer, Point3d>();
for (int i = 0; i < words.size(); i++) {
  Point3d p = words.get(i);
  if (p.x < 0 || p.y < 0 || p.z < 0) {
    negativeList.put(i + 1, p);
  } else {
    positiveList.put(i + 1, p);
  }
}

または上記を while ループに統合すると、すべての単語を 2 回繰り返す必要がなくなります。

于 2013-09-30T08:02:09.053 に答える