Определение того, связаны ли две строки в Hashmap<String, ArrayList> с помощью рекурсии?

#java #recursion #arraylist #hashmap #set

#java #рекурсия #arraylist #hashmap #установить

Вопрос:

Вопрос заключается в том, чтобы выяснить, возможно ли соединение между двумя авиакомпаниями. Для входного кода они дают нам список авиакомпаний, а затем, какие авиакомпании к которым подключены. Я смог прочитать все в сканер и создать Hashmap строковых значений, подключающихся к String ArrayList , чтобы компенсировать дублирование ключей. Проблем с Hashmap нет, так как после считывания всех ключей и соответствующих значений в их ArrayList все совпадало.

Ниже приведена распечатанная Hashmap(некоторые авиакомпании не перечислены ниже, потому что у них нет соединений, т.Е.: southwest):

 continental, [america_west, air_china, alaska, air_france, virgin_atlantic]
austrian_airways, [delta]
virgin_atlantic, [air_france]
delta, [swiss_air, austrian_airways, air_canada]
america_west, [mesa, alaska, twa]
  

Проблема заключается в вызове рекурсии, в которой, учитывая две строки Airlines, найдите, есть ли соединение. Моя приведенная ниже рекурсия проверяет, существует ли начальное соединение между авиакомпаниями, и оно не рекурсивно переходит внутрь. Однако ошибка, похоже, является ошибкой переполнения стека. Я не понимаю, почему он будет переполняться
, если в тестовом примере указаны авиакомпании {«delta» «america_west»},{«continental» «mesa»},{«southwest» «delta»}, {«twa» «air_france»}.

     public static boolean recur(String a, String b) {
    boolean connection = false;
    
    if(partners.containsKey(a)amp;amp;partners.get(a).contains(b)) {return true;}
    
    for(String airlines: (ArrayList<String>)partners.get(a)) {
        if(partners.containsKey(airlines))
            recur(airlines,b);
        }
    
    return connection;
    
}
  

Редактировать:
Извините, я не включил весь код, я загружаю его впервые, и я почувствовал, что он немного длинный.

открытый класс airlinePartners{

  static Map<String, ArrayList> partners = new HashMap<String, ArrayList>();
 static String returnT = "PARTNERSn";
 static String returnF = "No miles for youn";
 int number = 0;

public static void readIn() throws Exception{

    Scanner sc = new Scanner(new File("partners.dat"));
    String[] temp = new String[2];
    int airline = sc.nextInt();
    
    for(int i = 0; i < airline; i  ) {
        sc.next();
    }
    int partner = sc.nextInt();
    sc.nextLine();
    
    for(int i = 0; i < partner; i  ) {
        temp = sc.nextLine().split(" ");
        ArrayList<String> temps = new ArrayList<String>();
        if(partners.containsKey(temp[0])) {
            partners.get(temp[0]).add(temp[1]);
        }
        else {
        temps.add(temp[1]);
        partners.put(temp[0], temps);
        }
    }
    
    
    Iterator<Map.Entry<String, ArrayList>> i = partners.entrySet().iterator(); 
    while(i.hasNext()){String key = i.next().getKey();
        System.out.println(key ", " partners.get(key));
    }
    
    
    
    
    int repeat = sc.nextInt();
    sc.nextLine();
    for(int m = 0; m < repeat;m  ) {
        temp= sc.nextLine().split(" ");
        //System.out.println(temp[0]   " "  temp[1]);
        if(recur(temp[0], temp[1])) {
            System.out.println(returnT);
        }
        else {
            System.out.println(returnF);
        }
        
    }
    
}

public static boolean recur(String a, String b) {
    boolean connection = false;
    
    if(partners.containsKey(a)amp;amp;partners.get(a).contains(b)) {return true;}
    
    for(String airlines: (ArrayList<String>)partners.get(a)) {
        if(partners.containsKey(airlines))
            recur(airlines,b);
        }
    
    return connection;
    
}

public static void main(String args[]) throws Exception
{
    new airlinePartners().readIn();
}
  

}

Комментарии:

1. Можете ли вы включить оставшийся код — где вы вызываете recur и где вы заполняете partners Map ?

2. Ваш вызов recur() ничего не делает, поскольку вы игнорируете его возвращаемое значение.