int[] breakCaesar(HashMap<Integer, Integer> quantityHashMap) {
    // eine linkedlist bauen, die die character representationen enthält, von vorne nach hinten
    // sortiert nach der auftrittshäufigkeit
    LinkedList<Integer> charactersByQuantity = new LinkedList<Integer>();
    while (!quantityHashMap.isEmpty()) {
      // größten wert aus quantityHashMap bekommen
      int currKey = -1, currValue = -1, greatest = -1, mostFrequented = -1;
      Iterator<Integer> it = quantityHashMap.keySet().iterator();
      while (it.hasNext()) {
        currKey = it.next();
        currValue = quantityHashMap.get(currKey);

        if (currValue > greatest) {
          greatest = currValue;
          mostFrequented = currKey;
        }
      }
      // den mostfrequented als ersten eintrag hinzufügen
      charactersByQuantity.addLast(mostFrequented);
      // diesen eintrag aus der hashmap entfernen
      quantityHashMap.remove(mostFrequented);
    }

    Logger("breakCaesar charactersByQuantity=" + charactersByQuantity);

    // die beiden häufigsten buchstaben im gewählten alphabet, normalerweise e und n
    ArrayList<NGram> nGrams = FrequencyTables.getNGramsAsList(1, charMap);
    int[] nGramMostFrequentedMapped = new int[2];
    nGramMostFrequentedMapped[0] = charMap.mapChar(Integer.parseInt(nGrams.get(0).getIntegers())); // e
    nGramMostFrequentedMapped[1] = charMap.mapChar(Integer.parseInt(nGrams.get(1).getIntegers())); // n

    // mögliche shifts
    int[] computedShift = new int[4];
    // häufigster auf e
    computedShift[0] = charactersByQuantity.get(0) - nGramMostFrequentedMapped[0];
    // 2. häufigster auf e
    computedShift[1] = charactersByQuantity.get(1) - nGramMostFrequentedMapped[0];
    // häufigster auf n
    computedShift[2] = charactersByQuantity.get(0) - nGramMostFrequentedMapped[1];
    // 2. häufigster auf n
    computedShift[3] = charactersByQuantity.get(1) - nGramMostFrequentedMapped[1];

    // alle computedShifts vom negativen ins positive
    for (int i = 0; i < computedShift.length; i++) {
      if (computedShift[i] < 0) {
        computedShift[i] += modulus;
      }
    }

    // debug logging
    Logger("breakCaesar computedShift= ");
    for (int i = 0; i < computedShift.length; i++) {
      Logger("" + computedShift[i] + " (" + (char) charMap.remapChar(computedShift[i]) + ") , ");
    }

    return computedShift;
  }