#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() ничего не делает, поскольку вы игнорируете его возвращаемое значение.