Domanda

Supponiamo di avere alcuni elenchi ordinati di numeri interi e voglio convertirli sulle rispettive intervalli di cifre regex, come:

    .
  1. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] => [0-9]
  2. [0, 1, 2, 3, 4, 6, 7, 8, 9] => [0-46-9]
  3. [0, 1, 3, 4, 5, 8, 9] => [013-589]
  4. [0, 2, 4, 6, 8] => [02468]
  5. Non sto cercando di regex abbinare qualcosa qui.Sto cercando di generare una gamma di regex da un insieme di cifre.

    Sto davvero solo cercando se c'è già qualche algoritmo di fatto per fare qualcosa del genere.

    Modifica: Basato sulla risposta @ Jerry_Coffin, un algoritmo basato su Java:

    List<Integer> digits = Arrays.asList(0, 1, 3, 4, 5, 8, 9);
    StringBuilder digitRange = new StringBuilder().append('[');
    int consecutive = 0;
    for (int i = 0; i < digits.size(); i++) {
      if (i == digits.size() - 1 || digits.get(i) + 1 != digits.get(i + 1)) {
        if (consecutive > 1) {
            digitRange.append('-');
        }
        digitRange.append(digits.get(i));
        consecutive = 0;
      } else {
        if (consecutive == 0) {
          digitRange.append(digits.get(i));
        }
        consecutive++;
      }
    }
    digitRange.append(']');
    System.out.println(digitRange.toString());
    
    .

    Uscita: [013-589]

    Sentiti libero di trovare miglioramenti o problemi.

È stato utile?

Soluzione

Presumibilmente stai iniziando dall'input ordinato (in caso contrario, si desidera certamente iniziare ordinando l'input).

Da lì, inizia dal primo articolo (non elaborato), scriverlo.Camminare attraverso i numeri finché sono consecutivi.Supponendo che tu ottieni più di due consecutivi, scrivi un trattino poi l'ultimo dei numeri consecutivi.Se hai due o meno consecutivi, scrivili solo per emergere AS-è.

Ripeti fino a raggiungere la fine dell'input.

Altri suggerimenti

Posso proporre un approccio diverso.

ibero attraverso l'elenco che identifica gli intervalli.Teniamo due variabili left e right (limiti di intervallo) e ogni volta che abbiamo due valori non scrivono l'intervallo su un StringBuilder.

int[] list = new[] { 0, 1, 3, 4, 5, 8, 9 };
int left = 0;
int right = 0;
for (int i = 0; i < list.Length; i++)
{
    if (i == 0) // first case
    {
        left = right = list[i];
        continue;
    }
    if (list[i] - list[i - 1] > 1) // not consecutive
    {
        builder.AppendFormat(Write(left, right));
        left = list[i];
    }
    right = list[i];
}
builder.AppendFormat(Write(left, right));// last case
builder.Append("]");
.

Il metodo di scrittura:

private static string Write(int left, int right)
{
    return
        left == right
            ? left.ToString()
        : right - left == 1
            ? string.Format("{0}{1}", left, right)
            : string.Format("{0}-{1}", left, right);
}
.

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