Я думаю, что понимаю требование. По сути, есть некоторая желаемая ширина, и если количество выходов превышает ширину, то печатать с использованием эллипсов.
Существует StringUtils от Apache Commons , который имеет метод «Сокращения».
public static String abbreviate(String str,
int maxWidth)
Сокращает строку, используя эллипсы. Это превратит «Сейчас настало время для всех хороших людей» в «Сейчас настало время для ...»
Чтобы использовать это (или другое предложение ниже), я бы удалил непосредственный вывод, генерируемый в прогоне, и вместо этого построил String
. Можно также построить char[]
, но здесь мы пойдем с String
(или StringBuilder
). Это дает еще одно преимущество - как правило, рекомендуется отделять часть логики от выходных данных. Плюс это было бы более проверяемым.
Итак, если можно использовать StringUtils.abbreviate(...)
, тогда возьмите результат из doFlips(...)
и передайте его методу, и результат будет готов.
/*
* moved the flipping into a method; allow it to build the
* results rather than immediately outputting them
*/
private static StringBuilder doFlips(int numberOfFlips, Random rng)
{
long[] runLength = new long[numberOfFlips];
boolean theCoin;
boolean tempVal = false;
int run = 1;
int totalNumberOfRuns = 0;
// Here we will collect the output; use better name in production
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numberOfFlips; i++) {
theCoin = rng.nextBoolean(); // As requested, I used the nextBoolean
// expression.
if (theCoin != tempVal) {
if (i > 0) {
sb.append(run);
sb.append(" ");
}
runLength[run - 1]++;
totalNumberOfRuns++;
run = 1;
}
else {
run++;
}
if (theCoin) {
sb.append("H");
tempVal = true;
}
else {
sb.append("T");
tempVal = false;
}
}
return sb;
}
Если вы не можете использовать библиотеку, достаточно просто написать chop
метод:
/**
* Chop the input StringBuilder and give "..." at
* maxOutput.
*
* NOTE: no error checking
*/
private static String ourChop(StringBuilder sb, int maxOutput)
{
if (sb.length() <= maxOutput) {
return sb.toString();
}
// we chop everything past maxOutput - 3
sb.setLength(maxOutput - 3);
sb.append("...");
return sb.toString();
}
Итак, мы можем сделать следующее:
public static void main(String[] args)
{
int seed = 1200;
int maxOutput = 25;
// 50 flips, 25 length max, including ... if needed
StringBuilder res = doFlips(50, new Random(seed));
System.out.println(ourChop(res, maxOutput));
res = doFlips(60, new Random(seed));
System.out.println(ourChop(res, maxOutput));
И мы получаем этот вывод (в 25):
H1 T1 H1 T1 HHH3 TTTTT...
H1 T1 H1 T1 HHH3 TTTTT...
Теперь, если цель состоит в том, чтобы выровнять по максимальному выходу некоторого данного прогона, тогда нужно будет собрать все прогоны (50, 60 и т. Д.), А затем найти конкретное значение (скажем, самое короткое из выходы; обратите внимание, что в теории в действительно случайной ситуации 60 может иметь более короткий выход, чем 50, но не при использовании одного и того же начального числа) Затем можно использовать это определенное значение, чтобы нарезать до заданной выходной длины.
Если я неправильно понял подход, прошу прощения.