好的,所以我有一个程序,其中有一部分我需要“订购单词,使列表中每个项目的最后一个字母是下一个项目的第一个字母,一个由一个链接在一起的单词链最后和第一封信。“
样本输入是狗,大象,长颈鹿,犀牛,老虎 正确的输出是狗,长颈鹿,大象,老虎,犀牛 而我的输出是老虎,犀牛,狗,长颈鹿,大象。
比较器是这样的:
class linkedSort implements Comparator {
//will return 1 for a match
//returns 0 if no match
public int compare(Object t, Object t1) {
char[] charArr1 = t.toString().toCharArray();
char[] charArr2 = t1.toString().toCharArray();
if (charArr1[charArr1.length - 1] == charArr2[0]) {
return -1;
} else {
return 1;
}
}
}
任何帮助都会非常有用!!
答案 0 :(得分:10)
使用简单的比较器和排序无法解决这个问题,因为比较没有定义 total order 。总订单是以下四个属性所包含的订单:
您的订单不是全部订单。首先,它打破了反身性:例如,“a”≤“a”。其次,它打破了反对称性:“缓和”≤“前夕”和“前夕”≤“轻松”。第三,它打破了传递性:“东”≤“茶”和“茶”≤“aver”,但“东”≤“aver”是假的。最后,它不是完全的:“东”不小于“西”,“西”不小于“东”。
要解决此问题,您需要采用不同的方法。作为提示,您可能希望将问题视为图形,其中字母是节点,而单词是连接开始和结束字母的边。你能在这张图中找到一条只能访问每一条边的路径吗?
希望这有帮助!
答案 1 :(得分:3)
如果您希望使用sort
执行此操作,则此操作无效。比较器需要对集合强加总排序,但您的要求不是这样的。
答案 2 :(得分:1)
这相当于这个问题:Detecting when matrix multiplication is possible
答案 3 :(得分:0)
Comparator
方法不起作用。排序仅使用本地比较,但您的问题是全局“优化”。
为了说明,这里是Arrays.sort(array, comparator)
的实际比较。请注意,某些掉期会破坏之前做出的正确选择,因为它们只具有本地知识。
start: dog,elephant,giraffe,rhinoceros,tiger
dog, elephant (swap)
-> elephant,dog,giraffe,rhinoceros,tiger
dog, giraffe (OK)
-> elephant,dog,giraffe,rhinoceros,tiger
giraffe, rhinoceros (swap)
-> elephant,dog,rhinoceros,giraffe,tiger
dog, rhinoceros (swap)
-> elephant,rhinoceros,dog,giraffe,tiger
elephant, rhinoceros (swap)
-> rhinoceros,elephant,dog,giraffe,tiger
giraffe, tiger (swap)
-> rhinoceros,elephant,dog,tiger,giraffe
dog, tiger (swap)
-> rhinoceros,elephant,tiger,dog,giraffe
elephant, tiger (OK)
-> rhinoceros, elephant, tiger, dog, giraffe