docs: public List<String> getTextGraph( int maxBarLength ) {
          compute();
          if (maxBarLength < 1) maxBarLength = (int)this.getMaximumCount();
          final float barLengthForHundredPercent = this.buckets.isEmpty() ? maxBarLength : 100.0f * maxBarLength
                                                                                           / getMaximumPercentage();
          final String fullLengthBar = StringUtil.createString('*', (int)barLengthForHundredPercent);
          List<String> result = new LinkedList<String>();
          // First calculate the labels and the max length ...
          int maxLowerBoundLength = 0;
          int maxUpperBoundLength = 0;
          for (Bucket bucket : this.buckets) {
              maxLowerBoundLength = Math.max(bucket.getLowerBound().toString().length(), maxLowerBoundLength);
              maxUpperBoundLength = Math.max(bucket.getUpperBound().toString().length(), maxUpperBoundLength);
          }
  
          // Create the header ...
          int rangeWidth = 1 + maxLowerBoundLength + 3 + maxUpperBoundLength + 1;
          int barWidth = maxBarLength + 20;
          result.add(StringUtil.justifyLeft("Ranges", rangeWidth, ' ') + " Distribution");
          result.add(StringUtil.createString('-', rangeWidth) + ' ' + StringUtil.createString('-', barWidth));
          for (Bucket bucket : this.buckets) {
              float percent = bucket.getPercentageOfValues();
              long number = bucket.getNumberOfValues();
              StringBuilder sb = new StringBuilder();
              sb.append("[");
              sb.append(StringUtil.justifyLeft(bucket.getLowerBound().toString(), maxLowerBoundLength, ' '));
              sb.append(" - ");
              sb.append(StringUtil.justifyLeft(bucket.getUpperBound().toString(), maxUpperBoundLength, ' '));
              sb.append("] ");
              int barLength = Math.max((int)(barLengthForHundredPercent * percent / 100.0f), 0);
              if (barLength == 0 && number != 0) barLength = 1; // make sure there is a bar for all non-zero buckets
              sb.append(fullLengthBar.substring(0, barLength));
              if (number != 0) {
                  sb.append(" ");
                  sb.append(number);
                  sb.append(" (");
                  sb.append(new DecimalFormat("###.#").format(percent));
                  sb.append("%)");
              }
              result.add(sb.toString());
          }
          return result;
      }