Domanda

Nel corso degli ultimi due settimane che ho letto il libro Coding controllo errore: fondamenti e Applicazioni al fine di conoscere BCH (Bose, Chaudhuri, Hocquenghem) Codici per un ruolo di programmazione junior in una società di telecomunicazioni.

Questo libro copre in gran parte la matematica e la teoria dietro il soggetto, ma sto lottando per implementare alcuni dei concetti; soprattutto ricevendo il prossimo n codewords.I hanno una GUI (attuata tramite NetBeans, quindi non posterò il codice del file è enorme) che passa un codice al fine di ottenere il prossimo n numeri:

La generazione di questi numeri è dove sto avendo problemi. Se potessi passare attraverso tutti questi all'interno solo il metodo di codifica, invece di loop attraverso l'uso della GUI mia vita sarebbe dieci volte più facile.

Questo mi è stato facendo impazzire da giorni in quanto è abbastanza facile da generare 0000000000 dall'ingresso, ma sono perso su dove andare da lì con il mio codice. Che cosa devo fare allora per generare il numero di lavoro successivo?

Qualsiasi aiuto con la generazione del codice precedente sarebbe apprezzato.

È stato utile?

Soluzione

(grande edit ...) a giocare con il codice di un po 'di più questo sembra funzionare:

import java.util.ArrayList;
import java.util.List;


public class Main
{
    public static void main(final String[] argv)
    {
        final int startValue;
        final int iterations;
        final List<String> list;

        startValue = Integer.parseInt(argv[0]);
        iterations = Integer.parseInt(argv[1]);
        list = encodeAll(startValue, iterations);
        System.out.println(list);
    }

    private static List<String> encodeAll(final int startValue, final int iterations)
    {
        final List<String> allEncodings;

        allEncodings = new ArrayList<String>();

        for(int i = 0; i < iterations; i++)
        {
            try
            {
                final int    value;
                final String str;
                final String encoding;

                value = i + startValue;
                str = String.format("%06d", value);
                encoding = encoding(str);
                allEncodings.add(encoding);
            }
            catch(final BadNumberException ex)
            {
                // do nothing
            }
        }

        return allEncodings;
    }

    public static String encoding(String str)
        throws BadNumberException
    {
        final int[]         digit;
        final StringBuilder s;

        digit = new int[10];

        for(int i = 0; i < 6; i++)
        {
            digit[i] = Integer.parseInt(String.valueOf(str.charAt(i)));
        }

        digit[6] = ((4*digit[0])+(10*digit[1])+(9*digit[2])+(2*digit[3])+(digit[4])+(7*digit[5])) % 11;
        digit[7] = ((7*digit[0])+(8*digit[1])+(7*digit[2])+(digit[3])+(9*digit[4])+(6*digit[5])) % 11;
        digit[8] = ((9*digit[0])+(digit[1])+(7*digit[2])+(8*digit[3])+(7*digit[4])+(7*digit[5])) % 11;
        digit[9] = ((digit[0])+(2*digit[1])+(9*digit[2])+(10*digit[3])+(4*digit[4])+(digit[5])) % 11;

        // Insert Parity Checking method (Vandermonde Matrix)
        s = new StringBuilder();

        for(int i = 0; i < 9; i++)
        {
            s.append(Integer.toString(digit[i]));
        }

        if(digit[6] == 10 || digit[7] == 10 || digit[8] == 10 || digit[9] == 10)
        {
            throw new BadNumberException(str);
        }

        return (s.toString());
    }
}

class BadNumberException
    extends Exception
{
    public BadNumberException(final String str)
    {
        super(str + " cannot be encoded");
    }
}

Io preferisco gettare l'eccezione piuttosto che restituendo una stringa speciale. In questo caso ho ignorare l'eccezione che normalmente direi è una cattiva pratica, ma per questo caso penso che sia quello che vuoi.

Altri suggerimenti

Difficile da dire, se ho ottenuto il vostro problema, ma dopo aver letto la tua domanda più volte, forse è questo che stai cercando:

public List<String> encodeAll() {
  List<String> allEncodings = new ArrayList<String>();
  for (int i = 0; i < 1000000 ; i++) { 
    String encoding = encoding(Integer.toString(i));
    allEncodings.add(encoding);
  }
  return allEncodings;
}

C'è un difetto nella soluzione, i risultati non sono toOctalString 0 imbottite. Se è quello che vuoi, io suggerisco di usare String.format("<something>", i) nella chiamata codifica.

Aggiorna

Per utilizzarlo nella vostra chiamata corrente, sostituire una chiamata alla codifica (str String) con la chiamata a questo metodo. Riceverai una lista ordinata con tutte le codifiche.

I aasumed, si erano interessati solo a valori ottali - il mio errore, adesso penso che hai appena dimenticato la codifica per il valore 000009 in te esempio e quindi rimosso la roba ottale irretating

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top