package edu.stanford.nlp.sempre; import java.util.*; import fig.basic.LispTree; import fig.basic.LogInfo; public class ListValue extends Value { public final List<Value> values; public ListValue(LispTree tree) { values = new ArrayList<Value>(); for (int i = 1; i < tree.children.size(); i++) values.add(Values.fromLispTree(tree.child(i))); } public ListValue(List<Value> values) { this.values = values; } public LispTree toLispTree() { LispTree tree = LispTree.proto.newList(); tree.addChild("list"); for (Value value : values) tree.addChild(value == null ? LispTree.proto.newLeaf(null) : value.toLispTree()); return tree; } public void log() { for (Value value : values) LogInfo.logs("%s", value); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ListValue that = (ListValue) o; return values.equals(that.values); } @Override public int hashCode() { return values.hashCode(); } // Sorted on string representation public ListValue getSorted() { List<Value> sorted = new ArrayList<>(values); Collections.sort(sorted, (Value v1, Value v2) -> ( v1 == null ? "null" : v1.sortString()).compareTo(v2 == null ? "null" : v2.sortString())); return new ListValue(sorted); } // Unique public ListValue getUnique() { List<Value> sorted = new ArrayList<>(new HashSet<>(values)); Collections.sort(sorted, (Value v1, Value v2) -> ( v1 == null ? "null" : v1.sortString()).compareTo(v2 == null ? "null" : v2.sortString())); return new ListValue(sorted); } }