Problem med en metod.
Hej, lyckas ej med denna metod vi har fått ett gäng klasser i en uppgift vi ej skall göra något med och byggt en klass Route och i klassen ListGraph har vi fått alla metoder vi skall bygga.
Nu har vi kört fast på en metod och suttit ett par timmar :)
//Klassen Route
package se.su.inlupp;
import java.util.*;
public class Route<T> implements Edge<T>{
private String name;
private int weight;
private T destination;
public Route(String name, int weight, T destination) {
this.destination = Objects.requireNonNull(destination);
this.name = Objects.requireNonNull(name);
if(Double.isNaN(weight)){
throw new IllegalArgumentException();
}
this.weight = weight;
}
@Override
public T getDestination(){
return destination;
}
@Override
public int getWeight(){
return weight;
}
@Override
public void setWeight(int weight){
if(weight <0){
throw new IllegalArgumentException(" Weight cannot be negative");
}
this.weight = weight;
}
@Override
public String getName(){
return name;
}
@Override
public String toString(){
return "Edge[destination=" + destination + ", name=" + name + " weight=" + weight + "]";
}
}
//Klassen ListGraph
package se.su.inlupp;
import java.util.*;
public class ListGraph<T> implements Graph<T> {
private Map<T, Set<Route>> places = new HashMap<>();
public void add(T node) {
places.putIfAbsent(node, new HashSet<>());
}
public void connect(T node1, T node2, String name, int weight) {
if(!places.containsKey(node1) || !places.containsKey(node2) ) {
throw new NoSuchElementException();
}
if(weight <0){
throw new IllegalArgumentException();
}
add(node1);
add(node2);
Set<Route> fromPlaces = places.get(node1);
Set<Route> toPlaces = places.get(node2);
//Kontrollera om en kant redan finns från node1 till node2 eller från node2 till node1
for(Route route : toPlaces) {
if(route.getDestination().equals(node1)) {
throw new IllegalStateException();
}
}
fromPlaces.add(new Route(name, weight, node2));
toPlaces.add(new Route(name, weight, node1));
}
public void setConnectionWeight(T node1, T node2, int weight) {
if(weight <0){
throw new IllegalArgumentException();
}
if(!places.containsKey(node1) || !places.containsKey(node2) ) {
throw new NoSuchElementException();
}
Set<Route> fromPlaces = places.get(node1);
Set<Route> toPlaces = places.get(node2);
boolean ran = false;
for(Route route : toPlaces){
if (route.getDestination().equals(node1)){
route.setWeight(weight);
ran = true;
}
}
for(Route route : fromPlaces) {
if (route.getDestination().equals(node2)) {
route.setWeight(weight);
ran = true;
}
if (!ran) {
throw new NoSuchElementException();
}
}
}
public Set<T> getNodes(){
return places.keySet();
}
@Override
public Collection<Edge<T>> getEdgesFrom(T node) {
if(!places.containsKey(node)) {
throw new NoSuchElementException();
}
Set<Edge<T>> edges = new HashSet<>();
Set<Route> fromPlaces = places.get(node);
for(Edge<T> route : fromPlaces){
if(route.getDestination().equals(node)){
edges.add(route);
}
}
return edges;
}
public Route<T> getEdgeBetween(T node1, T node2) {
Set<Route> fromPlaces = places.get(node1);
Set<Route> toPlaces = places.get(node2);
if(!places.containsKey(node1) || !places.containsKey(node2)) {
throw new NoSuchElementException();
}
for (Route route : toPlaces) {
if (route.getDestination().equals(node1)) {
return route;
}
}
return null;
}
public void disconnect(T node1, T node2) {
if(!places.containsKey(node1) || !places.containsKey(node2) ) {
throw new NoSuchElementException();
}
Set<Route> fromPlaces = places.get(node1);
Set<Route> toPlaces = places.get(node2);
if(getEdgeBetween(node1, node2) != null) {
for(Route route : fromPlaces){
if(route.getDestination().equals(node1)){
fromPlaces.remove(route);
break;
}
}
for(Route route : toPlaces){
if(route.getDestination().equals(node2)){
toPlaces.remove(route);
break;
}
}
for(Route route : fromPlaces){
if(route.getDestination().equals(node2)){
fromPlaces.remove(route);
break;
}
}
for(Route route : toPlaces){
if(route.getDestination().equals(node1)){
toPlaces.remove(route);
break;
}
}
}
else{
throw new IllegalStateException();
}
}
public void remove(T node) {
if(!places.containsKey(node)) {
throw new NoSuchElementException();
}
places.remove(node);
}
public boolean pathExists(T from, T to) {
throw new UnsupportedOperationException("Unimplemented method 'pathExists'");
}
public List<Edge<T>> getPath(T from, T to) {
throw new UnsupportedOperationException("Unimplemented method 'getPath'");
}
}
//Metoden i ListGraph vi ej får att fungera
@Override
public Collection<Edge<T>> getEdgesFrom(T node) {
if(!places.containsKey(node)) {
throw new NoSuchElementException();
}
Set<Edge<T>> edges = new HashSet<>();
Set<Route> fromPlaces = places.get(node);
for(Edge<T> route : fromPlaces){
if(route.getDestination().equals(node)){
edges.add(route);
}
}
return edges;
}
//Felmeddelandet vi får när vi kör tester
[ERROR] GraphTest.test09_getEdgesFrom_existing_node_with_edges:244 expected: <2> but was: <0>
Tacksam för hjälp tack!
Jag har jobbat en hel del med grafer under åren. Intressant uppgift!
Hur som helst är det lite svårt att felsöka eftersom jag inte vet vad testet gör.
Mitt bästa tips är att skriva ett litet program (eller test) själva och se om er kod fungerar som tänkt. Alltså några rader kod som skapar en liten graf och sedan kontrollerar att getEdgesFrom() returnerar vad den borde. Gör den inte det kan det ju antingen vara fel i den metoden eller i er kod som skapar grafen.
Har ni möjlighet att köra i en debugger, sätta breakpoints och inspektera era variabler är det förstås också bra.
Annars kan debug-utskrifter här och var fungera bra. I sin enklaste form strategiskt placerade System.out.println(...).
Kikade lite på koden och den här ser suspekt ut, alternativt förstår jag inte logiken. Jag har kommenterat lite. Det är för övrigt ett tips. Kommentera koden! Det är lätt att tro att man har koll på vad som skall ske när man skriver den. Det är inte lika självklart att man förstår logiken en dag, en vecka senare, eller när man ber någon annan om hjälp.
// Hämtar edges som utgår ifrån en given node.
@Override
public Collection<Edge<T>> getEdgesFrom(T node) {
if(!places.containsKey(node)) {
// Noden finns inte så vi kastar exception.
throw new NoSuchElementException();
}
// Set för att hålla de edges vi samlar på oss.
// Vi kan hoppas att Edge<T> implementerar equals och hashCode korrekt,
// annars fungerar kanske det inte fungerar som tänkt.
Set<Edge<T>> edges = new HashSet<>();
// Hämta alla routes som utgår ifrån den givna noden.
Set<Route> fromPlaces = places.get(node);
// Loopa över routes ...
for(Edge<T> route : fromPlaces){
// Om routens *DESTINATION* är den givna noden, så lägg den till samlingen.
// Skulle vi inte hämta den som går *FRÅN* den givna noden?
// Det känns som om vi hämtar noder som går till sig själva?
if(route.getDestination().equals(node)){
edges.add(route);
}
}
return edges;
}
sictransit skrev:Kikade lite på koden och den här ser suspekt ut, alternativt förstår jag inte logiken. Jag har kommenterat lite. Det är för övrigt ett tips. Kommentera koden! Det är lätt att tro att man har koll på vad som skall ske när man skriver den. Det är inte lika självklart att man förstår logiken en dag, en vecka senare, eller när man ber någon annan om hjälp.
// Hämtar edges som utgår ifrån en given node. @Override public Collection<Edge<T>> getEdgesFrom(T node) { if(!places.containsKey(node)) { // Noden finns inte så vi kastar exception. throw new NoSuchElementException(); } // Set för att hålla de edges vi samlar på oss. // Vi kan hoppas att Edge<T> implementerar equals och hashCode korrekt, // annars fungerar kanske det inte fungerar som tänkt. Set<Edge<T>> edges = new HashSet<>(); // Hämta alla routes som utgår ifrån den givna noden. Set<Route> fromPlaces = places.get(node); // Loopa över routes ... for(Edge<T> route : fromPlaces){ // Om routens *DESTINATION* är den givna noden, så lägg den till samlingen. // Skulle vi inte hämta den som går *FRÅN* den givna noden? // Det känns som om vi hämtar noder som går till sig själva? if(route.getDestination().equals(node)){ edges.add(route); } } return edges; }
Stort tack för svaret och kommentererna vi testade mycket olika saker idag bland annat var vi inne lite på det du pratar om om Edge implementation av equals och hashCode..
Borde varit tydligare och skickat med lite instruktioner och metoden stort tack för att du tog dig tiden att kolla på det om detta kan hjälpa får du gärna kolla ytterligare jag har gått igenom instruktioerna och det står inte att vi skall implmentera vår 3.2 uppgift Edge för att kunna fortsätta utveckla ListGraph
Här är instruktioner:
Här är koden för Edge och för Graph:
//Kod Edge
package se.su.inlupp;
public interface Edge<T> {
int getWeight();
void setWeight(int weight);
T getDestination();
String getName();
}
//Kod Graph
package se.su.inlupp;
import java.util.Collection;
import java.util.List;
import java.util.Set;
public interface Graph<T> {
void add(T node);
void connect(T node1, T node2, String name, int weight);
void setConnectionWeight(T node1, T node2, int weight);
Set<T> getNodes();
Collection<Edge<T>> getEdgesFrom(T node);
Edge<T> getEdgeBetween(T node1, T node2);
void disconnect(T node1, T node2);
void remove(T node);
boolean pathExists(T from, T to);
List<Edge<T>> getPath(T from, T to);
}
Inga problem. Bara skoj!
Jag kommer inte att kika vidare på den här frågan nu. Klockan är mycket.
Återkom om ni inte kommer vidare, men det är svårt att debugga så här pass komplicerad kod utan att kunna köra den. Jag vet inte vad er deadline är men klart jag hjälper till om jag kan.
Påminner om tipset att logga ut saker till consolen, typ "nu gör jag det här; state var så här innan och är nu så här efteråt".
Det brukar hjälpa mycket!
Lycka till!
sictransit skrev:Inga problem. Bara skoj!
Jag kommer inte att kika vidare på den här frågan nu. Klockan är mycket.
Återkom om ni inte kommer vidare, men det är svårt att debugga så här pass komplicerad kod utan att kunna köra den. Jag vet inte vad er deadline är men klart jag hjälper till om jag kan.
Påminner om tipset att logga ut saker till consolen, typ "nu gör jag det här; state var så här innan och är nu så här efteråt".
Det brukar hjälpa mycket!
Lycka till!
Tack för tipsen jag skall kolla på det och även med gruppen det är ca 3 veckor så vi har en del tid men en tuff uppgift.