public void show(Formatter f) { java.util.List<Comparable> list = new ArrayList<>(set.keySet()); f.format("%n%s (%d)%n", name, list.size()); Collections.sort(list); if (showRange) { int n = list.size(); if (n == 0) f.format("none%n"); else f.format(" %10s - %10s: count = %d%n", list.get(0), list.get(n - 1), getUnique()); } else { Comparable prev = null; for (Comparable key : list) { int count = set.get(key); boolean isHashDup = (prev != null) && key.hashCode() == prev.hashCode(); boolean isNameDup = (prev != null) && key.toString().equals(prev.toString()); f.format(" %s %10s: count = %d%n", isHashDup != isNameDup ? "*" : " ", key, count); prev = key; } } }
private boolean isRegular(Counters.Counter resol) { if (resol.getUnique() == 1) return true; // all same resolution, or n == 1 Comparable mode = resol.getMode(); Number modeNumber = (Number) mode; if (modeNumber == null || modeNumber.intValue() == 0) return false; int modeCount = 0; int nonModeCount = 0; for (Comparable value : resol.getValues()) { if (value.compareTo(mode) == 0) modeCount = resol.getCount(value); else { Number valueNumber = (Number) value; // non mode must be a multiple of mode - means there are some missing values int rem = (valueNumber.intValue() % modeNumber.intValue()); if (rem != 0) return false; int multiple = (valueNumber.intValue() / modeNumber.intValue()); nonModeCount += (multiple - 1) * resol.getCount(value); } } if (modeCount == 0) return true; // cant happen i think // only tolerate these many missing values double ratio = (nonModeCount / (double) modeCount); return ratio < missingTolerence; }