Odinare righe per lettere

mercoledì 27 febbraio 2008 - 11.52

liveforever81 Profilo | Junior Member

Salve a tutti...

Vorrei sottoporvi un problema d'ordinamento: ho un arraylist di stringhe e dovrei fare un ordinamento su di esso del tipo:

Fare un check sul 4o carattere della stringa in ingresso (e qui uso il Substring)...
se tale carattere è B spostare la riga in alto
se è I inserirla sotto le righe B
se è C sotto le I
se è P sotto le C

in modo da avere un blocco così:

B
B
B
B
B
I
I
C
C
P
P
P


Come poter fare?
Inoltre...per tener traccia di quanti elementi ha ciascun sottoblocco, avevo pensato ad un ciclo for, che ne dite?

Ferux Profilo | Newbie

Ciao,
volevo sapere se sei tu che costruisci l'ArrayList oppure ti arriva da un'altra fonte e non puoi farci nulla.
Perchè io non utilizzerei l'array list ma ad esempio un hashtable (con chiave le lettere {B,C,P,} e valore un array di stringhe).
A seconda di dove deve andare la stringa tu richiami tramite la chiave il tipo di record {B,P,C}
tifai restituire l'array e ci inserisci la stringa.

Inoltre non devi inventarti nessun metodo strano di ordinamento.

Spero di essere stato chiaro.
Saluti



Ing Ferux
[MCP MCAD]

liveforever81 Profilo | Junior Member

Ti dirò...c'ho capito poco! :D

Io in ingresso ho solo questo file di testo con molteplici righe e non devo far altro che ordinarle (su un'altra struttura, preferibilmente un arraylist) in funzione del 4o carattere (lettera B,I,C o P), strutturandola a 'blocchi di lettere'

Ferux Profilo | Newbie

Ciao,
ora ho capito, tu leggi dal file ed ogni riga effettui il controllo sul carattere 40. Perfetto.

Allora invece di mettere le righe nell'ArrayList tu le metti in un HashTable (struttura con coppia chiave\valore)dove la chiave è il blocco che identifica {B,P,C,I} e il valore è un array di stringhe contenenti le stringhe di testo presenti nel file.
In questo modo tu alla fine del gioco avrai 4 chiavi {B,I,C,P} ed un array associato ad ogni chiave contenente un array di stringhe.
A questo punto un foreach sulle chiavi ti restituisce le stringhe già ordinate e puoi recuperare l'intero array associato ad un blocco {B ad esempio} dando il nome della chiave.

Spero di essere stato chiaro; altrimenti appena ho tempo ti posto un esempio

Saluti


Ing Ferux
[MCP MCAD]

liveforever81 Profilo | Junior Member

Dove sbaglio?
Appena trova una nuova occorrenza di, ad esempio, "B" come primo carattere, mi scoppia...come fare per 'accordarlo'?

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace Ordina_Lettere
{
class Program
{
static void Main(string[] args)
{
Hashtable riga_ente = new Hashtable();
ArrayList lista = new ArrayList();

int ret=0;
int contatore_a = 0;
int contatore_b = 0;
int contatore_c = 0;
int contatore_totale = 0;

string uno = "A12345667790";
contatore_totale++;
string due = "B12345678900";
contatore_totale++;
string tre = "C03940934093";
contatore_totale++;
string quattro = "D04930943094";
contatore_totale++;
string uno_uno = "A39209320932";
contatore_totale++;
string due_due = "B49093094033";
contatore_totale++;
string quattro_quattro = "C2903920329";
contatore_totale++;

lista.Add(uno);
lista.Add(due);
lista.Add(tre);
lista.Add(due);
lista.Add(quattro);
lista.Add(due_due);
lista.Add(uno_uno);
lista.Add(quattro_quattro);

for (int i = 0; i < lista.Count; i++)
{
string leggi = (string)lista[i];

if (leggi.Substring(0, 1) == "A")
{
riga_ente.Add(1, leggi);
}
else if (leggi.Substring(0, 1) == "B")
{
riga_ente.Add(2, leggi);
}
else if (leggi.Substring(0, 1) == "C")
{
riga_ente.Add(3, leggi);
}
else
{
riga_ente.Add(4, leggi);
}
}


}

Ferux Profilo | Newbie

Ciao,
ecco il codice di esempio:

manca la parte di lettura file ma credo che tu la sappia fare. Vedi se ti convince:

class Program
{
public enum Keys {B,C,I,P};

static void Main(string[] args)
{
Hashtable riga_ente = new Hashtable();

//Inizzializzazione
for (int i = 0; i < Enum.GetValues(Keys).Length; i++)
{
ArrayList _list = new ArrayList();
riga_ente.Add(Enum.GetValues(Keys).GetValue(i), _list);
}
//*** Adesso hai un hashtable con arraylist vuoti ***

//Apri il tuo file e cominci a leggere riga a riga
//richiami la funzione e gli passi
inserisciElemento("B", rigaFile);

//Chiudi il file

//******** Numero elementi **********
int i = restituisciNumeroElementi("B");
i = restituisciNumeroElementi("C");


}

public void inserisciElemento(string elemento,string rigaFile)
{
foreach (DictionaryEntry item in riga_ente)
{
if (item.Key.ToString() == elemento)
{
ArrayList _list = (ArrayList)item.Value;
_list.Add(rigaFile);
break;
}
}
}

public int restituisciNumeroElementi(string elemento)
{
int count = 0;
foreach (DictionaryEntry item in riga_ente)
{
if (item.Key.ToString() == elemento)
{
ArrayList _list = (ArrayList)item.Value;
count = _list.Count;
break;
}
}
return count;
}
}

Ovviamente puo essere ottimizzato, ma quello che vorrei che capissi è la logica che c'è dietro.
Saluti

Ing Ferux
[MCP MCAD]
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5