我如何实现一种头到尾的列表?

时间:2010-02-09 16:01:05

标签: java algorithm

给出以下输入:(注意:这不是链接列表,它是我无法控制的Web应用程序的所有字符串输出)

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 个答案:

答案 0 :(得分:4)

如果你不打算重复,那么最简单的方法就是使用Map。将每个头尾对作为键和值。然后,您可以使用前一个尾部作为下一个头来使用Map.get()遍历列表。

另一方面,你遇到了在列表中找到第一个项目的问题:这将是一个永远不会显示为尾部的头部。为此,我猜您可以从values()中逐步减去keySet()。假设你确实有一个链,结果将是包含列表中第一个元素的单例集。

答案 1 :(得分:0)

我迟到了,但是我已经使用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());
    }
}