Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
.NET Framework
Odinare righe per lettere
mercoledì 27 febbraio 2008 - 11.52
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
liveforever81
Profilo
| Junior Member
104
messaggi | Data Invio:
mer 27 feb 2008 - 11:52
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
44
messaggi | Data Invio:
mer 27 feb 2008 - 13:10
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
104
messaggi | Data Invio:
mer 27 feb 2008 - 13:32
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
44
messaggi | Data Invio:
mer 27 feb 2008 - 14:24
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
104
messaggi | Data Invio:
mer 27 feb 2008 - 14:59
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
44
messaggi | Data Invio:
mer 27 feb 2008 - 17:37
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]
Torna su
Stanze Forum
Elenco Threads
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 !