Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C#] Ordinare righe per lettere

    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?

  2. #2
    codice:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;
    
    namespace ConsoleApplication7
    {
        class Program
        {
            static void Main(string[] args)
            {
                ArrayList lista = new ArrayList();
    
                lista.Add("CAAP");
                lista.Add("CABP");
                lista.Add("CACP");
                lista.Add("CADP");
                lista.Add("CAAC");
                lista.Add("CABC");
                lista.Add("CACC");
                lista.Add("CADC");
                lista.Add("CAAI");
                lista.Add("CABI");
                lista.Add("CACI");
                lista.Add("CADI");
                lista.Add("CAAB");
                lista.Add("CABB");
                lista.Add("CACB");
                lista.Add("CADB");
    
                lista.Sort(new MyStringComparer());
    
                foreach (string str in lista)
                {
                    Console.WriteLine(str);
                }
    
                Console.Read();
            }
        }
    
        public class MyStringComparer : IComparer
        {
            #region IComparer<string> Members
    
            public int Compare(object objx, object objy)
            {
                string x = (objx as string).ToLower();
                string y = (objy as string).ToLower();
    
                switch (x[3])
                {
                    case 'p':
                        if (y[3] == 'c')
                            return 1;
                        if (y[3] == 'b')
                            return 1;
                        if (y[3] == 'i')
                            return 1;
                        break;
                    case 'c':
                        if (y[3] == 'p')
                            return -1;
                        if (y[3] == 'b')
                            return 1;
                        if (y[3] == 'i')
                            return 1;
                        break;
                    case 'i':
                        if (y[3] == 'c')
                            return -1;
                        if (y[3] == 'b')
                            return 1;
                        if (y[3] == 'p')
                            return -1;
                        break;
                    case 'b':
                        if (y[3] == 'c')
                            return -1;
                        if (y[3] == 'p')
                            return -1;
                        if (y[3] == 'i')
                            return -1;
                        break;
                    default:
                        return 0;
                }
    
                return 0;
            }
    
            #endregion
        }
    }
    devi passare un comparer al metodo sort dell'array list creato apposta per realizzare il tuo ordinamento. io non l'ho ottimizzato, ma si può migliorare il codice.

    Cerco ombrello vecchio, nuovo, moderno o antidiluviano; purché protegga da una pioggia che vien giù come Dio la manda. Fate presto che ho l’acqua alla gola. (Noè)

    C# programming and other stuffs

  3. #3
    Grazie chip...

    mi sono trovato bene perchè funziona...ma mi sono ingarbugliato forse sulla parte + semplice...il passaggio dei valori! :S

    Allora:
    La mia applicazione è così strutturata:

    Main()
    {
    Normalizzazione.Elabora();
    }


    classe Normalizzazione
    {
    Elabora()
    {
    OrdinaRighe();
    }
    }

    OrdinaRighe()
    {
    Lista.Sort(new MyStringComparer));

    foreach (string str in Lista)
    {
    Console.Writeline(str);
    }
    }

    Nella classe da te creata voglio piazzare anche dei contatori (interi) per ciascun carattere 'trovato' e passare 'sti valori alla funzione OrdinaRighe (contenuta nella Classe Normalizzazione)...come catanazzo fare? :-s

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.