Как мне реализовать что-то типа «голова к хвосту»? - PullRequest
2 голосов
/ 09 февраля 2010

Учитывая следующие входные данные: (примечание: это не связанный список, это всего лишь одна строка вывода из веб-приложения, которое я не могу контролировать)

DAVSCAF1WD6-11 ==> MOTENVF1WD6-11 
MOTENVF1WD6-11 ==> WNDVUTF1WD4-11 
TPKAKSF1WD6-11 ==> KSCYMOF1WD6-11
WNDVUTF1WD3-11 ==> WGTNUTF1WD2-11
DNVRCOF1WD7-11 ==> BELTKSF1WD3-11 
SNFCCAF1WD6-16 ==> DAVSCAF1WD5-16
WGTNUTF1WD2-11 ==> DTSRCOF1WD3-11
DTSRCOF1WD3-11 ==> DNVRCOF1WD6-11 
BELTKSF1WD3-11 ==> TPKAKSF1WD6-11

Мне нужно получить следующие результаты:

SNFCCAF1WD6-16 ==> DAVSCAF1WD5-16 
DAVSCAF1WD6-11 ==> MOTENVF1WD6-11 
MOTENVF1WD6-11 ==> WNDVUTF1WD4-11 
WNDVUTF1WD3-11 ==> WGTNUTF1WD2-11 
WGTNUTF1WD2-11 ==> DTSRCOF1WD3-11
DTSRCOF1WD3-11 ==> DNVRCOF1WD6-11 
DNVRCOF1WD7-11 ==> BELTKSF1WD3-11 
BELTKSF1WD3-11 ==> TPKAKSF1WD6-11 
TPKAKSF1WD6-11 ==> KSCYMOF1WD6-11

Это список, где каждый хвост указывает на голову следующего элемента в строке (напр. SNFCCAF ==> DAVSCAF ==> DAVSCAF ==> MOTENVF ==> MOTENVF ==> WNDVUTF ==> etc.) В этом случае значимы только ведущие альфа-символы.

Как я могу сделать это максимально элегантно? Язык, на котором это реализуется, - Java.

Ответы [ 2 ]

4 голосов
/ 09 февраля 2010

Если у вас не будет дубликатов, возможно, самый простой способ сделать это - использовать карту. Поместите каждую пару голова-хвост в качестве ключа и значения. Затем вы можете просмотреть список с помощью Map.get (), используя предыдущий хвост в качестве следующей головы.

С другой стороны, вы столкнулись с проблемой поиска первого элемента в списке: это была бы голова, которая никогда не будет выглядеть как хвост. Для этого, я думаю, вы могли бы вытащить values() из keySet(). Предполагая, что у вас действительно есть цепочка, результатом будет одноэлементное множество, содержащее первый элемент в списке.

0 голосов
/ 27 мая 2011

Я опоздал на это, но, FWIW, я использовал Google Collections для аналогичной проблемы, где у меня есть список, содержащий записи с переменным числом строк. Для более легкого управления я решил создать такие функции стиля головы / хвоста:

public class MyListUtils {

    public static <T> List<T> getHeadSubList(List<T> list, Predicate<T> predicate) {
        int firstItem = indexOf(list, predicate);

        if (firstItem < 0)
            return new ArrayList<T>(); // return empty list if none found

        if (firstItem == list.size() - 1)   // It's the last element of the list
            return list.subList(firstItem, list.size());

        List<T> rest = list.subList(firstItem + 1, list.size());
        int nextItem = indexOf(rest, predicate);

        if (nextItem < 0)
            return list;
        else
            return list.subList(firstItem, nextItem + 1);
    }

    public static <T> List<T> getTailSubList(List<T> list, Predicate<T> predicate) {
        List<T> head = getHeadSubList(list, predicate);

        if (head.isEmpty() || head.size() == list.size())
            return new ArrayList<T>(); // return empty list if none found

        return list.subList(head.size(), list.size());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...