Построить цепочку ссылок из списка

1

У меня есть список пар ключ/значение, и мне нужно обнаружить цепочки в списке, где значение соответствует ключу.

например. из ниже могут быть 12, 23, 34 или 62, 23, 34

Key  Value
1    2
3    4
2    3
6    2

Более одного значения может указывать на один и тот же ключ, но мне нужно хранить разные "цепи" для каждой уникальной начальной и конечной точки. Список может быть в любом порядке.

Я использую Java, но я немного зациклился на том, как решить эту проблему.

Пожалуйста, помогите!

  • 0
    Я думаю, что вы имели в виду «12, 23, 34 или 62, 23, 34» вместо этого.
  • 0
    да, моя ошибка, просто исправил это - спасибо
Теги:
list
hashmap

3 ответа

0
Лучший ответ

Рекурсия!

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)
0

Создайте 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
    }
}

Очевидно, что это псевдокод, который не будет компилироваться, но он должен начать работу

0

Поскольку это выглядит как домашнее задание, я дам вам подсказки, которые помогут вам решить проблему самостоятельно, а не дать вам полное решение.

  • Для любого ключа на карте вы можете получить соответствующее значение, вызвав Map.get(key).
  • Вы можете использовать любое значение в качестве ключа, чтобы получить его соответствующее значение (если оно есть).
  • Вы можете перебирать все ключи на карте с помощью Map.getKeys().

Если вы хотите распечатать цепочки, этого должно быть достаточно. Если вы хотите сохранить цепочки в некоторой другой структуре данных, пожалуйста, предоставьте дополнительную информацию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню