如何检查列表的哪个值最高另一个列表

时间:2016-01-30 01:36:48

标签: java list

这是我的情况:我有一个值列表A.我还有列表B,其中包含排名层次结构。第一个是最高的,最后一个是最低的。列表A将包含列表B中的一个,部分或全部值。我想查看列表A中哪个值是列表B中的最高度(或最低索引)。我将如何做到最好?

以防万一仍然不清楚,这是一个例子:

List A: Merchant, Peasant, Queen
List B: King, Queen, Knight, Merchant, Peasant

我希望这种方法在这种情况下吐出女王

3 个答案:

答案 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更好的方法是使用GuavaOrdering课程,该课程提供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;
}