Come creare un singolo valore di indice intero basato su due numeri interi in cui il primo è illimitato?

0

Ho dati tabella contenenti un valore intero X che va da 1 .... sconosciuto e un valore intero Y che va da 1..9
I dati devono essere presentati in ordine 'X poi Y'.

Per un componente visivo posso impostare più nomi di indice: X; Y
Ma per un altro componente ho bisogno di un valore intero unidimensionale come indice (criterio di ordinamento).

Se X era limitato a un limite superiore di dire 100, il valore a una dimensione poteva essere semplicemente X * 100 + Y.
Se il valore a una dimensione poteva essere reale, potrebbe essere X + Y / 10.

Ma se voglio mantenere X illimitato, c'è un modo per calcolare un singolo valore 'indicizzazione' di interi da X e Y?

[Aggiunto] Informazioni di background :

Ho un componente Gantt / TreeList in cui le attività sono ordinate su un intero TaskIndex. Non è necessario che sia un campo di database reale, ma posso renderlo un campo calcolato nel set di dati del client sottostante.

I miei dati di tabella sono ad es. come segue:

ID    Baseline   ParentID
 1       0          0     (task)
 5       2          1     (baseline)
 8       1          1     (baseline)
 9       0          0     (task)
12       0          0     (task)
16       1         12     (baseline) 

L'attività 1 ha due baseline numerate 1 e 2 (ID 8 e 5)
L'attività 9 non ha linee di base
Il task 12 ha una linea di base numerata 1 (ID 16)

Baselines numero 1-9 (la variabile Y dalla mia domanda); 0 o null identificano le attività
Gli ID sono illimitati (la variabile X)

L'utente gioca con la visibilità delle linee di base, ad es. vuole vedere tutte le attività e tutte le linee di base etichettate 1. Ciò avviene aggiornando un filtro sulla tabella.

In questo momento devo ricalcolare costantemente TaskIndex dopo aver modificato il filtro (eseguendo il looping dei record con un contatore). Sarebbe bello se TaskIndex potesse essere calcolato al volo per ogni record conoscendo solo i dati ID e Baseline nel record corrente (lavoro in Delphi dove un set di dati del client ha un gestore di eventi OnCalcFields, che viene attivato per ogni record quando necessario).

Non ho controllo sui meccanismi interni del componente visivo.

    
posta Jan Doggen 04.11.2013 - 16:35
fonte

3 risposte

3

Poiché il tuo indice meno significativo (Y) è limitato, per ottenere il giusto tipo di ordinamento, puoi semplicemente fare index = X*10 + Y e ordinare index sul suo valore numerico .

Se l'indice generale è troppo grande per rientrare in un valore intero, è possibile simulare l'ordinamento numerico riempendo i numeri più corti con zeri iniziali fino a quando tutti i valori nel confronto hanno la stessa lunghezza.

    
risposta data 05.11.2013 - 09:28
fonte
3

dato che Y è limitato puoi semplicemente usarlo come prefisso perché i numeri crescono a destra, quindi non puoi usarlo come suffisso.

Quindi se Y è 8 e X è un numero di 4000 cifre, sarebbe 8XXXXXXXXXXXXXXXXXXXXXX [...].

Anche se ho letto che stai cercando di fare l'ordinamento, quindi questa forma di ordinamento sarebbe Y prima, X secondo, che potrebbe non essere quello che vuoi.

Se vuoi ordinare usando la composizione di X e Y con X come primario, puoi semplicemente volere che qualcosa sia ordinato per X, dove ogni elemento è un'altra raccolta ordinata per Y, quindi puoi usare un'iterazione semplicistica su il set per ottenere una lista semplice che è ordinata come desideri.

    
risposta data 04.11.2013 - 16:44
fonte
1

Ho incontrato un problema simile in precedenza, e l'ho risolto sfruttando il fatto che il file binario riempito sarà sempre correttamente, sia analizzato come stringa o come numero.

Ecco lo pseudocodice (il riempimento per fare un numero di 32 cifre, puoi tagliarlo):

define X,Y as int
define Xbin, Ybin as string
Xbin = ConvertToBinary(X).PadLeft(28, "0")
Ybin = ConvertToBinary(Y).PadLeft(4, "0")
return Xbin + Ybin

Per 5 serie di dati scelti a caso:

6737, 7 -> 00000000000000011010010100010111
51, 6   -> 00000000000000000000001100110110
2, 0    -> 00000000000000000000000000100000
864, 5  -> 00000000000000000011011000000101
165, 3  -> 00000000000000000000101001010011

Ordinato (sia per valore stringa o valore numerico),

00000000000000000000000000100000 <- 2, 0 
00000000000000000000001100110110 <- 51, 6
00000000000000000000101001010011 <- 165, 3
00000000000000000011011000000101 <- 864, 5
00000000000000011010010100010111 <- 6737, 7

* Modifica: * Ho usato 2 28 valore di archiviazione qui, ma poiché questi possono essere memorizzati come stringhe, non esiste un limite superiore efficace. Se stai memorizzando la X nel database come int , allora dovresti usare 32 come numero X-padding. Se long , 64 . Se stai utilizzando qualcosa che supporta numeri più grandi di 64 bit, continua ad espandere a seconda dei casi.

Se lo stai memorizzando come string / varchar nel database, hai un problema. Se la tua lingua / database ha una lunghezza massima per una stringa, non puoi garantire che non si verificherà un overflow aggiungendo ulteriori informazioni al suo interno. Se non si dispone di un limite, non è possibile calcolare il riempimento massimo necessario.

    
risposta data 04.11.2013 - 17:39
fonte

Leggi altre domande sui tag