这是我的情况:我有一个值列表A.我还有列表B,其中包含排名层次结构。第一个是最高的,最后一个是最低的。列表A将包含列表B中的一个,部分或全部值。我想查看列表A中哪个值是列表B中的最高度(或最低索引)。我将如何做到最好?
以防万一仍然不清楚,这是一个例子:
List A: Merchant, Peasant, Queen
List B: King, Queen, Knight, Merchant, Peasant
我希望这种方法在这种情况下吐出女王
答案 0 :(得分:1)
假设列表B已经从顶级排序 - >排序最低等级,你能解决的一种任意方式是
public static void main (String[] args) throws Exception {
String[] firstList = { "Merchant", "Peasant", "Queen" };
String[] secondList = { "King", "Queen", "Knight", "Merchant", "Peasant" };
for (String highRank : secondList) {
for (String lowRank : firstList) {
if (highRank.equalsIgnoreCase(lowRank)) {
System.out.println(highRank);
return;
}
}
}
}
答案 1 :(得分:1)
您所描述的内容称为" partial ordering",实现您在Java中寻找的行为的正确方法是使用Comparator
定义排序;类似的东西:
public class PartialOrdering<T> implements Comparator<T> {
private final Map<T, Integer> listPositions = new HashMap<>();
public PartialOrdering(List<T> elements) {
for (int i = 0; i < elements.size(); i++) {
listPositions.put(elements.get(i), i);
}
}
public int compare(T a, T b) {
Integer aPos = listPositions.get(a);
Integer bPos = listPositions.get(b);
if (aPos == null || bPos == null) {
throw new IllegalArgumentException(
"PartialOrdering can only compare elements it's aware of.");
}
return Integer.compare(aPos, bPos);
}
}
然后,您只需致电Collections.max()
即可找到第一个列表中的最大值。
比其他任何一个答案更有效率,这些答案都是O(n ^ 2)并且不会连贯地处理未知元素(他们假设我们有一个总排序)
比实现自己的PartialOrdering
更好的方法是使用Guava的Ordering
课程,该课程提供efficient partial ordering和其他一些课程有用的工具。使用番石榴,您需要做的就是:
// Or store the result of Ordering.explicit() if you need to reuse it
Ordering.explicit(listB).max(listA);
答案 2 :(得分:0)
我认为这可能有用,试试看:
function int getHighest(List<String> listA, List<String> listB)
{
int index = 0;
int max = 100;
int tmpMax = 0;
for(String test:lista)
{
for(int i =0;i<listb.size();++i)
{
if(list.get(i).equals(test))
{
tmpMax = index;
}
}
if(tmpMax < max) max = tmpMax;
++index;
}
return max;
}