public static ArrayList<Thing> allThingFragments(Thing thing) { ArrayList<Thing> result = new ArrayList<Thing>(); result.add(thing); for (Thing t : thing.getIncludes()) if (t != thing) { for (Thing c : allThingFragments(t)) if (!result.contains(c)) result.add(c); } return result; }