package plugins.harmonization;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Terms
{
/*
* Given a list 'start' with tokens (a predictor). Return all possible
* different lists in which the tokens appear in the same order, possibly
* concatenated. Each list can be considered as a set of 'building blocks'.
*/
public static ArrayList<List<String>> getTermsLists(List<String> start)
{
ArrayList<List<String>> result = new ArrayList<List<String>>();
if (0 < start.size())
{
for (int pos = 0; pos < start.size(); pos++)
{
ArrayList<String> left = asOneElement(start.subList(0, pos + 1));
result.addAll(combine(left, getTermsLists(start.subList(pos + 1, start.size()))));
}
}
return result;
}
/*
* Concatenate all list elements to one string. Return a list which has only
* one element: that string.
*/
private static ArrayList<String> asOneElement(List<String> list)
{
String result = "";
for (int i = 0; i < list.size(); i++)
result = result + (0 == i ? "" : " ") + list.get(i);
return new ArrayList<String>(Arrays.asList(result));
}
/*
* If termsLists empty, then return a list with only prefix in it. Else
* prepend prefix to each element in termsLists, and return the result.
*/
private static ArrayList<List<String>> combine(ArrayList<String> prefix, ArrayList<List<String>> termsLists)
{
ArrayList<List<String>> result = new ArrayList<List<String>>();
if (0 == termsLists.size())
{
result.add(prefix);
}
else
{
for (int i = 0; i < termsLists.size(); i++)
{
ArrayList<String> newResult = new ArrayList<String>();
newResult.addAll(prefix);
newResult.addAll(termsLists.get(i));
result.add(newResult);
}
}
return result;
}
public static void main(String[] args)
{
ArrayList<String> example = new ArrayList<String>(Arrays.asList("parental", "diabetes", "mellitus", "type2",
"test"));
System.out.println(getTermsLists(example));
}
}