List<String> original = Lists.newArrayList("A", "B", "C");
Collection<List<String>> permutations= Collections2.orderedPermutations(original)
给出
[A, B, C]
[A, C, B]
[B, A, C]
[B, C, A]
[C, A, B]
[C, B, A]
太好了,现在我有了所有可能的排列。 但是,让我们说A和C是平等的,当它们彼此相邻时,它们的顺序无关紧要。
通缉结果:
[A, C, B] or [C, A, B]
[B, A, C] or [B, C, A]
[A, B, C]
[C, B, A]
所以我们尝试使用比较器
Collection<List<String>> permutations= Collections2.orderedPermutations(original, new Comparator<String>() {
@Override
public int compare(final String o1, final String o2) {
if ((o1.equals("A") && o2.equals("C")) || (o2.equals("A") && o1.equals("C"))) {
return 0;
}
return o1.compareTo(o2);
}
});
但这并没有给我们预期的结果
[A, B, C]
[A, C, B]
有关如何获得所需结果的任何建议吗? 虽然我们使用了番石榴,但任何lib或自定义解决方案都可以。
答案 0 :(得分:1)
我希望这会奏效。我没有测试过。
public int compare(String o1, String o2) {
if (o1.equals("C")) o1 = "A";
if (o2.equals("C")) o2 = "A";
return o1.compareTo(o2);
}
编辑:添加了缺少的括号
答案 1 :(得分:1)
如果你想删除在逻辑上等价的排列,那么我认为你应该首先写出实际的3排列,因为如果A
和C
是同一个东西,它们会真正出现:
[A, B, A]
[A, A, B]
[B, A, A]
[B, A, A]
[A, A, B]
[A, B, A]
删除重复项后,您将留下:
[A, B, A]
[A, A, B]
[B, A, A]
通过使用Set<List<String>>
,您可以保留副本,即
List<String> original = Lists.newArrayList("A", "B", "C");
Collection<List<String>> permutations = Collections2.orderedPermutations(original);
// now add your collection to a set to remove duplicates
Set<List<String>> permsNoDupes = new HashSet<>(permutations);
答案 2 :(得分:1)
我的建议是成对(“A”,“C”)&amp; (“C”,“A”)总是首先放“A”并将其转换为(“A”,“C”)
List<String> original = Lists.newArrayList("A", "B", "C");
Set<List<String>> permutations = Collections2.orderedPermutations(original).
stream().
map(list -> {
int indexOfc = list.get(0) == "C" ? 0 : (list.get(1) == "C" ? 1 : -1);
if (indexOfc != -1 && list.get(indexOfc + 1) == "A") {
// modifications not allowed on original list
list = new ArrayList<>(list);
list.set(indexOfc, "A");
list.set(indexOfc + 1, "C");
}
return list;
}).collect(Collectors.toSet());
结果
[[A, B, C], [C, B, A], [B, A, C], [A, C, B]]