给出以下输入:(注意:这不是链接列表,它是我无法控制的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。
答案 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());
}
}