public StreamCipherDecryptor() {
    cryptogramsArray = Operations.getCryptogramsArray(cryptogramsFilePath);
    codeToDecrypt = cryptogramsArray[cryptogramsArray.length - 1];
    max = codeToDecrypt.size();
    key = new int[codeToDecrypt.size()];

    /** **************** Initialize every key value on -1 ********************* */
    for (int i = 0; i < key.length; i++) key[i] = -1;

    /** *********** Getting every chars that can be used in text ************** */
    possibleChars = Operations.getPossibleChars();

    /** *********** In loop program looking for most probably keys ************ */
    for (int i = 0; i < max; i++) {
      probablyKeys = new ArrayList<>();
      for (ArrayList<Integer> cryptogram : cryptogramsArray) {
        int value = cryptogram.get(i);
        for (SingleChar singleChar : possibleChars) {
          int key = xor(value, singleChar.getCharacter());
          ProbablyKey p = getProbablyKey(key);
          if (p == null) {
            p = new ProbablyKey(key);
            p.addWeight(singleChar.getWeight());
            probablyKeys.add(p);
          } else p.addWeight(singleChar.getWeight());
        }
      }
      probablyKeys = Sort.sort(probablyKeys);
      key[i] = chooseBestKey(i);
    }
    printDecryted();
  }
 private int chooseBestKey(int i) {
   for (ProbablyKey p : probablyKeys) {
     int counter = 0;
     for (ArrayList<Integer> cryptogram : cryptogramsArray) {
       int encrypted = xor(cryptogram.get(i), p.getKey());
       if (!isCharacter(encrypted)) break;
       counter++;
     }
     if (counter > cryptogramsArray.length - 1) return p.getKey();
   }
   return -1;
 }
 private ProbablyKey getProbablyKey(int key) {
   for (ProbablyKey probablyKey : probablyKeys)
     if (probablyKey.getKey() == key) return probablyKey;
   return null;
 }