重新措辞:如何检查一个ArrayList中的所有元素是否与另一个ArrayList中的前一个ArrayList的顺序或顺序相同?

时间:2015-11-16 15:59:10

标签: java arraylist

ArrayList one包含

['a', 'b', 'm',  'd']

ArrayList二包含

['c', 'a', 't', 'b', 'u',  'm',  'd'].

如果two.containsAll(one)返回true,

如何检查一个元素中的所有元素是否按顺序排列? 换句话说: 如何检查位置顺序是否为[a< b< m< d]两个,因为他们处于这个位置。

3 个答案:

答案 0 :(得分:0)

假设second中没有重复项,second包含first中的所有元素,您可以使用List.indexOf来比较first中的相邻元素}:

static <T> boolean ordered(List<? extends T> first, List<? extends T> second) {
  if (!first.isEmpty()) {
    int prev = second.indexOf(first.get(0));
    for (int i = 1; i < first.size(); ++i) {
      if (prev > (prev = second.indexOf(first.get(i)))) {
        return false;
      }
    }
  }
  return true;
}

示例调用:

System.out.println(ordered(
    Arrays.asList('a', 'b', 'm', 'd'),
    Arrays.asList('c', 'a', 't', 'b', 'u', 'm', 'd'))); // Prints true.
System.out.println(ordered(
    Arrays.asList('a', 'b', 'd', 'm'),
    Arrays.asList('c', 'a', 't', 'b', 'u', 'm', 'd'))); // Prints false.

答案 1 :(得分:0)

我建议采用以下程序:

  1. 制作ArrayList一和二的可修改副本以用作工作空间(即work1work2)。
  2. 删除work2中未显示的work1的所有元素(请考虑方法retainAll())。这些对分析没有任何贡献。
  3. 迭代work2中的其余元素,并用该元素的单个实例替换同一元素的任何连续运行。 (我想这里的列表一个不包含任何欺骗;如果可能的话,那么也会在work1上执行重复删除。)
  4. work1中移除work2中未显示的任何元素。这些与work2的订单问题无关。
  5. 比较两个工作清单是否相等(equals())。
  6. 它处理所有情况,包括列表2包含重复元素和/或不包含列表1的所有元素的情况(即使其中一个或两个列表为空)。

    或者,您无需通过此过程复制或修改列表即可完成此操作:

    迭代列表一,并为每个元素e1

    1. 在列表二(e1)中找到lastIndexOf()的最后一个外观(如果有)。如果出现,那么
    2. 为列表一中的e1后面的每个元素扫描列表2的前面元素(考虑形成列表2的subList()并使用其contains()方法)。假设列表一中没有欺骗。
    3. 当且仅当在步骤2中执行的扫描没有资助任何元素时,列表2与列表1定义的顺序一致。

      无论哪种方式,你的家庭作业的实际代码都由你来写。

答案 2 :(得分:0)

我刚使用KMP算法概念并将其应用于列表。

public boolean containsAll(ArrayList<Integer> list1, ArrayList<Integer> list2)
{
  if(list1.size() == 0 || list2.size() < 0)
   return false;
  int k = 0;
  int list1Size = list1.size();
  int x = list1.get(k);
  for(int i = 0; i < list2.size(); ++i)
  {
    if(list2.get(i) == x)//if an element matches then goto the next element in list2
    {
     k++;
     if(k == list1Size)
       return true;
     x = list1.get(k);//get next element of list1 to match with
    }
    }
 return false;
}