001package org.hl7.fhir.utilities; 002 003import java.util.ArrayList; 004import java.util.List; 005 006import org.hl7.fhir.utilities.MergedList.MergeNode; 007 008/** 009 * A list of items that represent 010 * @author graha 011 * 012 * @param <T> 013 */ 014public class MergedList<T> extends ArrayList<MergeNode<T>> { 015 016 private static final long serialVersionUID = 1L; 017 018 public static interface IMatcher<T1> { 019 public boolean match(T1 l, T1 r); 020 } 021 022 public static class MergeNode<T1> { 023 private T1 left; 024 private T1 right; 025 public MergeNode(T1 left, T1 right) { 026 super(); 027 this.left = left; 028 this.right = right; 029 } 030 public T1 getLeft() { 031 return left; 032 } 033 public T1 getRight() { 034 return right; 035 } 036 037 public boolean hasLeft() { 038 return left != null; 039 } 040 041 public boolean hasRight() { 042 return right != null; 043 } 044 @Override 045 public String toString() { 046 return (hasLeft() ? left.toString() : "null") + " :: "+(hasRight() ? right.toString() : "null"); 047 } 048 } 049 050 public MergedList(List<T> left, List<T> right, IMatcher<T> matcher) { 051 super(); 052 List<T> m = new ArrayList<>(); 053 for (T l : left) { 054 T t = null; 055 for (T r : right) { 056 if (matcher.match(l, r)) { 057 t = r; 058 m.add(r); 059 break; 060 } 061 } 062 this.add(new MergeNode<T>(l, t)); 063 } 064 for (T r : right) { 065 if (!m.contains(r)) { 066 this.add(new MergeNode<T>(null, r)); 067 } 068 } 069 } 070 071 public MergedList(List<T> left, List<T> right) { 072 super(); 073 for (int i = 0; i < Integer.max(left.size(), right.size()); i++) { 074 T l = i < left.size() ? left.get(i) : null; 075 T r = i < right.size() ? right.get(i) : null; 076 this.add(new MergeNode<T>(l, r)); 077 } 078 } 079 080}