2017-03-29 8 views
0

検索システムを開発しています。私は同じ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を使ったプログラミングにはとても新しいです。

+0

以下のようになりますセットコレクションが一意である各要素が必要になりますが、必ずしも順序を保持しません使用して、あまりにも – Dhiraj

答えて

0

オブジェクトを比較するには、equalsメソッドをオーバーライドする必要があります。 以下のコードは同じものを参照してください。

public static void main(String[] args) { 
     Coordinates c1 = new Coordinates(10, 15); 
     List<Coordinates> coordinatesList = new ArrayList<>(); 
     coordinatesList.add(c1); 

     Coordinates c2 = new Coordinates(10, 15); 
     for(Coordinates coordinate:coordinatesList){ 
     if (coordinate.equals(c2)) { 
      System.out.println("Equal "); 
     } else { 
      System.out.println("Not Equal "); 
     } 
     } 
    } 

座標クラスは

class Coordinates{ 
    private double x, y;  

    public Coordinates(double x, double y) { 
     this.x= x; 
     this.y= y; 
    } 

    // Overriding equals() to compare two Complex objects 
    @Override 
    public boolean equals(Object o) { 

     // If the object is compared with itself then return true 
     if (o == this) { 
      return true; 
     } 

     /* Check if o is an instance of Complex or not 
      "null instanceof [type]" also returns false */ 
     if (!(o instanceof Coordinates)) { 
      return false; 
     } 

     // typecast o to Complex so that we can compare data members 
     Coordinates c = (Coordinates) o; 

     // Compare the data members and return accordingly 
     return Double.compare(x, c.x) == 0 
       && Double.compare(y, c.y) == 0; 
    } 
} 
+0

助けてくれてありがとうございますが、結果は同じです。同じ座標がopenSetに追加され、その結果、隣接する検索で同じコードが複数回検索されます。あなたの道を走るコードのいくつかを微調整しました。 – pedpx2

+0

私のソリューションを使用しようとすると、arrayListを使用することができます。このようにif文を使うのではなく、たくさんのif文を使いました。新しいオブジェクトをリストに追加する前に、リスト内のオブジェクトを比較します。これにより、重複する座標がリストに追加される可能性がなくなります。 – Dhiraj

-1

リストの代わりにセットを使用します。もう必要がなければ、いいえ。また、自分のオブジェクトには、独自のhashCodeメソッドとequalsメソッドがあることを確認します。

+0

をチェックリストクラスを投稿してください。 – SLWS

+0

順序セットもあります。 –