検索システムを開発しています。私は同じCoordinateが検索キューに複数回追加されるこの問題を抱えています。これらの問題を除外するためにif文を追加しましたが、まだ発生していますが、理由がわかりません。 LinkedHashSet
を使用する方法が見つからなかったため、新しいオブジェクトをリストに追加しようとしました。ArrayListに要素を追加し、その要素がArrayListに同じ値を持つ場合は追加できません。
package pathFinding;
import java.util.ArrayList;
import java.util.LinkedHashSet;
public class SearchOld {
public static Boolean pathFind(Coord start, Coord end /*, ArraList<Coord> blocked*/){
boolean arrive = false;
boolean way = false;
ArrayList<Node> openList = new ArrayList<Node>();
ArrayList<Node> closedList = new ArrayList<Node>();
ArrayList<Node> adjNode = new ArrayList<Node>();
ArrayList<Coord> emptyList = new ArrayList<Coord>();
int num = 0;
Node startNode = new Node(start, start);
closedList.add(startNode);
openList.add(startNode);
System.out.println(openList.get(0).getCoord().getX() + " " + openList.get(0).getCoord().getY());
a:{while(!arrive){
all:{for(int i = 0;i<openList.size();i++){
if(end.getX() == openList.get(i).getCoord().getX() && end.getY() == openList.get(i).getCoord().getY()){
arrive = true;
break all;
}
adjNode.addAll(Adjacent.findAdjacent(openList.get(0).getCoord()));
for(int j=0;j<adjNode.size();j++){
check:{for(int k = 0;k<openList.size();k++){
if(adjNode.get(0).getCoord().getX() == openList.get(k).getCoord().getX() && adjNode.get(0).getCoord().getY() == openList.get(k).getCoord().getY()){
adjNode.remove(0);
System.err.println("X" + adjNode.get(0).getCoord().getX() + "Y" + adjNode.get(0).getCoord().getY());
arrive = true;
break check;
}else{
for(int l = 0;l<closedList.size();l++){
if(adjNode.get(0).getCoord().getX() == closedList.get(l).getCoord().getX() && adjNode.get(0).getCoord().getY() == closedList.get(l).getCoord().getY()){
/*if(end.getX() == adjNode.get(0).getCoord().getX() && end.getY() == adjNode.get(0).getCoord().getY()){
openList.add(adjNode.get(0));
closedList.add(adjNode.get(0));
break all;
}*/
adjNode.remove(0);
break check;
}else{
openList.add(adjNode.get(0));
adjNode.remove(0);
break check;
}
}
}
}}
}
closedList.add(openList.get(0));
openList.remove(0);
LinkedHashSet<Node> tempSet = new LinkedHashSet<Node>();
tempSet.addAll(closedList);
closedList.clear();
closedList.addAll(tempSet);
};}
};}
//Coordinate got add many times
for(int m = 0;m<closedList.size();m++){
if(closedList.get(m).getCoord().getX() != closedList.get(m).getParent().getX() || closedList.get(m).getCoord().getY() != closedList.get(m).getParent().getY()){
System.out.println("X"+closedList.get(m).getCoord().getX()+"Y"+closedList.get(m).getCoord().getY() +"Parent X" + closedList.get(m).getParent().getX() + "Y" + closedList.get(m).getParent().getY());
}else{
System.err.println("X"+closedList.get(m).getCoord().getX()+"Y"+closedList.get(m).getCoord().getY() +"Parent X" + closedList.get(m).getParent().getX() + "Y" + closedList.get(m).getParent().getY());
}
};
System.out.println(closedList.size());
System.out.println(arrive);
//return closedList;
return arrive;
}
}
クラスAdjacent.java
public static ArrayList<Node> findAdjacent(Coord coord){
ArrayList<Node> adj = new ArrayList<Node>();
if(coord.getX() > 1){
Node left = new Node(new Coord(coord.getX()-1, coord.getY()), coord);
adj.add(left);
}
if(coord.getX() < 25){
Node right = new Node(new Coord(coord.getX()+1, coord.getY()), coord);
adj.add(right);
}
if(coord.getY() > 1){
Node up = new Node(new Coord(coord.getX(), coord.getY()-1), coord);
adj.add(up);
}
if(coord.getY() < 25){
Node down = new Node(new Coord(coord.getX(), coord.getY()+1), coord);
adj.add(down);
}
return adj;
}
コメント内のものは、この問題が修正されたとき、私は後で追加することを意味します。助けてくれてありがとう。
[EDIT]
私は今、座標を比較する比較方法を変更するに@Dhirajの提案を試みました。しかし結果は変わらず、検索キューに複数回追加されます。私はまた、コードを少しきれいにしました。
クラスSearch.java:
package pathFinding;
import java.util.ArrayList;
import java.util.LinkedHashSet;
public class Search {
public static Boolean pathFind(Coord start, Coord end /*, ArraList<Coord> blocked*/){
boolean arrive = false;
boolean way = false;
ArrayList<Node> openList = new ArrayList<Node>();
ArrayList<Node> closedList = new ArrayList<Node>();
ArrayList<Node> adjNode = new ArrayList<Node>();
ArrayList<Coord> emptyList = new ArrayList<Coord>();
int num = 0;
Node startNode = new Node(start, start);
closedList.add(startNode);
openList.add(startNode);
System.out.println(openList.get(0).getCoord().getX() + " " + openList.get(0).getCoord().getY());
a:{while(arrive == false){
if(CheckList.checkCoordInNodeArray(openList, end) || CheckList.checkCoordInNodeArray(closedList, end)){
arrive = true;
break;
}
all:{for(int i = 0;i<openList.size();i++){
adjNode.addAll(Adjacent.findAdjacent(openList.get(0).getCoord()));
for(int j=0;j<adjNode.size();j++){
if(CheckList.checkCoordInNodeArray(adjNode, end)){
arrive = true;
break all;
}
if(CheckList.checkCoordInNodeArray(openList, adjNode.get(0).getCoord()) == false || CheckList.checkCoordInNodeArray(closedList, adjNode.get(0).getCoord()) == false){
System.out.println("o " + CheckList.checkCoordInNodeArray(openList, adjNode.get(0).getCoord()) + " X" + adjNode.get(0).getCoord().getX() + "Y" + adjNode.get(0).getCoord().getY());
System.out.println("c " + CheckList.checkCoordInNodeArray(closedList, adjNode.get(0).getCoord())+ " X" + adjNode.get(0).getCoord().getX() + "Y" + adjNode.get(0).getCoord().getY());
openList.add(adjNode.get(0));
adjNode.remove(0);
break;
}else{
adjNode.remove(0);
break;
}
}
closedList.add(openList.get(0));
openList.remove(0);
LinkedHashSet<Node> tempSet = new LinkedHashSet<Node>();
tempSet.addAll(closedList);
closedList.clear();
closedList.addAll(tempSet);
};}
};}
//Coordinate got add many times
System.out.println("CSIZE" + closedList.size());
for(int m = 0;m<closedList.size();m++){
if(closedList.get(m).getCoord().getX() != closedList.get(m).getParent().getX() || closedList.get(m).getCoord().getY() != closedList.get(m).getParent().getY()){
System.out.println("X"+closedList.get(m).getCoord().getX()+"Y"+closedList.get(m).getCoord().getY() +"Parent X" + closedList.get(m).getParent().getX() + "Y" + closedList.get(m).getParent().getY());
}else{
System.err.println("X"+closedList.get(m).getCoord().getX()+"Y"+closedList.get(m).getCoord().getY() +"Parent X" + closedList.get(m).getParent().getX() + "Y" + closedList.get(m).getParent().getY());
}
};
System.out.println(closedList.size());
System.out.println(arrive);
//return closedList;
return arrive;
}
}
[EDIT2] ここに私のCheckList.java
package pathFinding;
import java.util.ArrayList;
public class CheckList {
public static boolean checkNodeArray(ArrayList<Node> ar, Node no){
boolean ava = true;
for(Node node : ar){
if(no.equals(node.getCoord())){
ava = true;
}else{
ava = false;
}
}
return ava;
}
public static boolean checkCoordInNodeArray(ArrayList<Node> ar, Coord Coor){
boolean ava = true;
for(Node node : ar){
if(Node.compareNodeCoord(Coor, node)){
ava = true;
}else{
ava = false;
}
}
return ava;
}
public static Coord findCoordInNodeArray(ArrayList<Node> ar, Coord Coor){
Coord coor = Coor;
for(Node node : ar){
if(Node.compareNodeCoord(Coor, node) == true){
coor = node.getParent();
break;
}else{
}
}
if(coor == Coor){
System.err.println("NotFound");
}
return coor;
}
}
そして、ここでは私のcompareNodeCoord()
public static boolean compareNodeCoord(Node node1, Node node2){
boolean equal = false;
if(node1.equals(node2.getCoord())){
equal = true;
}else{
equal = false;
}
return equal;
}
public static boolean compareNodeCoord(Coord coor1, Node node2){
boolean equal = false;
if(coor1.equals(node2.getCoord())){
equal = true;
}else{
equal = false;
}
return equal;
}
あります
この問題はあまり重要ではありませんが、移動したブロックのサイズを増やし始めると、プログラムは非常に長いループでスタックされます。
ごめんなさい。私はここで非常に新しいですし、Javaを使ったプログラミングにはとても新しいです。
以下のようになりますセットコレクションが一意である各要素が必要になりますが、必ずしも順序を保持しません使用して、あまりにも – Dhiraj