3.819 messaggi dal 28 gennaio 2003
ho un vettore bidimensionale di interi

Dim v4(,) = {{14, 16, 18}, {3, 30, 40}, {1, 10, 50}, {2, 20, 60}}

vorrei ordinarla secondo i valori della prima colonna


{{1, 10, 50}, {2, 20, 60}, {3, 30, 40}, {14, 16, 18}}


c'è un modo semplice per farlo?

ciao.


ps.
Mi serve per fare una ricerca binaria sulla prima colonna. Per esempio, se cerco 14 (1° colonna), mi deve dare il valore 16 (2° colonna)

O comunque, debbo fare una ricerca veloce sulla prima colonna in una lista di circa 10000 elementi.
Modificato da pietro09 il 04 agosto 2018 09.50 -

Pietro
10.806 messaggi dal 09 febbraio 2002
Contributi
Credo che purtroppo con gli array multidimensionali non ci sia un modo semplice per farlo.
Ho trovato questo ma è ben lontano dall'essere semplice o elegante.
https://web.archive.org/web/20160819174858/http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=151

Ti è possibile usare array di array (anche chiamati jagged arrays) anziché array multidimensionali? In quel modo potresti usare LINQ.

Il Python è più ferrato nella manipolazione di array multidimensionali e quindi, se devi lavorare in maniera massiccia con matrici e volumi, potresti valutare IronPython che funziona con .NET e usare il porting di Numpy.
Comunque, dato che questo tipo di manipolazioni si usano parecchio in machine learning, che il tema del momento, può darsi che esista un qualche pacchetto NuGet in grado di farlo di cui non sono a conoscenza.

Array.Sort non funziona con array multidimensionali.
Il nuovo tipo Span<T> non sembra essere in grado di operare su array multidimensionali.
Modificato da BrightSoul il 04 agosto 2018 10.09 -

Enjoy learning and just keep making
3.819 messaggi dal 28 gennaio 2003
E' un sollievo. Pensavo di essermi molto arruginito.
In attesa ho provato questo, modo antico, ma sembra funzionare

Dim sb1 As New StringBuilder()


'vettore bidimensionale (4 righe, 3 colonne)
Dim v4(,) = {{14, 16, 18}, {3, 30, 40}, {1, 10, 50}, {2, 20, 60}}

'mostro il v4 originale
sb1.Clear()
For i As Integer = 0 To v4.GetUpperBound(0)
  For j As Integer = 0 To v4.GetUpperBound(1)
    If j > 0 Then sb1.Append(", ")
    sb1.Append(v4(i, j))
  Next
  If i < v4.GetUpperBound(0) Then sb1.Append("|")
Next
l.PrintLn(PlaceHolder1, sb1.ToString, "v4 originale")

'adesso lo ordino secondo la 1° colonna

sb1.Clear()
'vettore indici riga originali di v4
Dim v(v4.GetUpperBound(0)) As Integer
For i As Integer = 0 To v.GetUpperBound(0)
  v(i) = i
Next
'vettore chiavi (1° colonna di v4)
Dim k(v4.GetUpperBound(0)) As Integer
For i As Integer = 0 To v.GetUpperBound(0)
  k(i) = v4(i, 0)
Next


Array.Sort(k, v) 'ordino il vettore indici originali di v4 secondo la chiave 4 (1° colonna di v4)
For i As Integer = 0 To v.GetUpperBound(0)
  For j = 0 To v4.GetUpperBound(1)
    If j > 0 Then sb1.Append(", ")
    sb1.Append(v4(v(i), j))
  Next
  If i < v.GetUpperBound(0) Then sb1.Append("|")
Next
l.PrintLn(PlaceHolder1, sb1.ToString, "v4 ordinato su 1° colonna")

'ricerca binaria di v4. Cerco 3 nella prima colonna e devo trovare il valore della seconda colonna, 30
'cerco nel vettore delle chiavi k il valore 40
Dim k_index As Integer = Array.BinarySearch(Of Integer)(k, 14) '=>3
If k_index >= 0 Then
  Dim v_index As Integer = v(k_index) '=>0
  Dim valore_cercato As Integer = v4(v_index, 1)
  l.PrintLn(PlaceHolder1, valore_cercato, "valore 2° colonna di v4 per valore 1° colonna = 14") '=>16
Else
  l.PrintLn(PlaceHolder1, "NON TROVATO")
End If

Pietro

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.