java - 判断一个列表是否是另一个具有正确顺序的列表的有序子集的函数 c# 或 java

标签 java c# algorithm

我正在研究一种执行以下操作的算法 我有两个List<String> ,说

List<String> A == {"20", "32A", "50K", "50F", "50D", "70", "72"}
List<String> B == {"20", "32A", "72"}

我想确保列表 BA子集按照正确的顺序

示例:

  • B == {"20", "32A", "72"}应该返回true

  • B == {"20", "32A", "70"}应该返回true

  • B == {"20", "32A", "40"}应该返回false ( A 没有 "40" )

  • B == {"32A", "20", "70"}应该返回false ( A"20", "32A", "70" 订单)

最佳答案

让我们概括一下这个问题:如果有 IEnumerable<T>是另一个 IEnumerable<T> 的有序子集(C#)。

代码(C#):

public static bool IsOrderedSubset<T>(IEnumerable<T> list, 
                                      IEnumerable<T> subset, 
                                      IComparer<T> comparer = null) {
  if (null == comparer)
    comparer = Comparer<T>.Default;

  if (null == comparer)
    throw new ArgumentNullException(nameof(comparer), 
                                  $"No default comparer for {typeof(T).Name}");

  if (null == list || null == subset)
    return false;

  using (var enSubset = subset.GetEnumerator()) {
    using (var enList = list.GetEnumerator()) {
      while (enSubset.MoveNext()) {
        while (true) {
          if (!enList.MoveNext())
            return false;
          else if (comparer.Compare(enList.Current, enSubset.Current) == 0)
            break;
        }
      }
    }
  }

  return true;
}

演示:

List<string> A = new List<String>() {
  "20", "32A", "50K", "50F", "50D", "70", "72"};

List<string>[] Bs = new List<string>[] {
  new List<string>() { "20", "32A", "72"},
  new List<string>() { "20", "32A", "70"},
  new List<string>() { "20", "32A", "40"},
  new List<string>() { "32A", "20", "70"},
};

var report = string.Join(Environment.NewLine, Bs
  .Select(B => $"[{string.Join(", ", B)}] : {(IsOrderedSubset(A, B) ? "true" : "false")}"));

Console.Write(report);

结果:

[20, 32A, 72] : true
[20, 32A, 70] : true
[20, 32A, 40] : false
[32A, 20, 70] : false

关于java - 判断一个列表是否是另一个具有正确顺序的列表的有序子集的函数 c# 或 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59938131/

相关文章:

c# - 如何通过外部调制解调器连接的串口发送拨号信息?

java - 随机整数上的堆栈溢出

java - 不考虑 java 周末和银行假日的耗时

java - 长时间运行的调度程序抛出访问 jpa/ejb 对象的异常

java - 使用 Java 表达式查找评论

c# - 解压缩 Gzip 字符串 C# Windows Phone 8

c# - 有没有办法在 Visual Studio 中的 "break all"之后保留在当前文档上?

java - Eclipse 单选项卡用于浏览 Java 类

c - 通过模糊匹配检测重复名称

algorithm - 在几次传递中对间隔进行分组