У меня есть список пар ключ/значение, и мне нужно обнаружить цепочки в списке, где значение соответствует ключу.
например. из ниже могут быть 12, 23, 34 или 62, 23, 34
Key Value
1 2
3 4
2 3
6 2
Более одного значения может указывать на один и тот же ключ, но мне нужно хранить разные "цепи" для каждой уникальной начальной и конечной точки. Список может быть в любом порядке.
Я использую Java, но я немного зациклился на том, как решить эту проблему.
Пожалуйста, помогите!
Рекурсия!
import java.util.HashMap;
import java.util.Map;
public class Chain
{
private static Map< String , String > map;
public static void main( String args[] )
{
map = new HashMap< String , String >();
map.put( "1" , "2" );
map.put( "3" , "4" );
map.put( "2" , "3" );
map.put( "6" , "2" );
for ( String key : map.keySet() )
{
System.out.print( "(" + key + "," + map.get( key ) + ")" );
recurse( map.get( key ) );
System.out.println();
}
}
private static void recurse( String value )
{
if ( map.containsKey( value ) )
{
System.out.print( " (" + value + "," + map.get( value ) + ")" );
recurse( map.get( value ) );
}
}
}
Выдает следующий результат:
(3,4)
(2,3) (3,4)
(1,2) (2,3) (3,4)
(6,2) (2,3) (3,4)
Создайте Map<Integer, List<Integer>>
, сохраните все свои пары на этой карте и затем выполните итерацию карты.
Псевдо-код:
// 1st step
foreach(key, value){
if(!map.containsKey(key)){
map.put(key, new ArrayList());
}
map.get(key).add(value);
}
// 2nd step
foreach(entry /* of map */){
if(map.containsKey(entry.value)){
// print pairs
}
}
Очевидно, что это псевдокод, который не будет компилироваться, но он должен начать работу
Поскольку это выглядит как домашнее задание, я дам вам подсказки, которые помогут вам решить проблему самостоятельно, а не дать вам полное решение.
Map.get(key)
.Map.getKeys()
.Если вы хотите распечатать цепочки, этого должно быть достаточно. Если вы хотите сохранить цепочки в некоторой другой структуре данных, пожалуйста, предоставьте дополнительную информацию.