Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    205

    [java]lista cancella dopo ogni val

    Salve,
    devo fare un metodo che data una lista cancelli quei valori minori di da quel numero in poi minori di esso

    es: lista 15 - 4 - 12 - 24 - 8 - 3 -16 dato il valore 12 restituisce la
    lista 15 - 4 - 12 - 16

    ho iniziato ad impostarlo così:

    codice:
    public boolean cancellaTuttiMinoriDopoVal(int val) {
        boolean canc = false;
    
        if(first == null) {
            return canc;
            }
    
        ListElem iterator = first;
    
        while(iterator.next != null) {
                if(iterator.next.dato < val) {
                    iterator.next=iterator.next.next;
                    canc = true;
                }
                System.out.println("dato saltato: "+iterator.next.dato);
                  iterator = iterator.next;
              }
    
    
        if(first.dato < val) {
                first=first.next;
                }
    
                return canc;
    
        }
    però non riesco a capire come devo fare ad iniziare a cancellare raggiunto il valore poi non capisco perchè se mettodo due numeri minori vicini me ne cancella solamente uno!

    Grazie

  2. #2

    Re: [java]lista cancella dopo ogni val

    Originariamente inviato da Uccio87
    Salve,
    devo fare un metodo che data una lista cancelli quei valori minori di da quel numero in poi minori di esso

    es: lista 15 - 4 - 12 - 24 - 8 - 3 -16 dato il valore 12 restituisce la
    lista 15 - 4 - 12 - 16
    Ok, però dovresti far vedere come è definita la lista su cui vuoi costruire il metodo. Leggendo il codice sembra che si tratti di una implementazione che usa le strutture collegate, però non è abbastanza per conoscere esattamente la realizzazione.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    205

    Re: Re: [java]lista cancella dopo ogni val

    Originariamente inviato da VincenzoTheBest
    Ok, però dovresti far vedere come è definita la lista su cui vuoi costruire il metodo. Leggendo il codice sembra che si tratti di una implementazione che usa le strutture collegate, però non è abbastanza per conoscere esattamente la realizzazione.
    codice:
    public class MiaLista {
    
        private class ListElem {
        
            private int dato;
            private ListElem next = null;
    
            public int getDato() {
                return dato;
            }
      
            public void setDato(int dato) {
                this.dato = dato;
            }
    
            public ListElem getNext() {
                return next;
            }
        
            public void setNext(ListElem next) {
                this.next = next;
            }
    
            public boolean equals(int val) {
                return dato == val;
            }
    
            public void draw() {
                System.out.print("["+ dato + "|");
                if (next == null)
                    System.out.print("null");
                else
                    System.out.print("next");
                System.out.print("]");
            }
        }
        
        private ListElem first;
     
        public MiaLista() {
            first = null;
        }
    
        public void insert(int val) {
    
            ListElem elem = new ListElem();
            elem.setDato(val);
            elem.setNext(first);
    
            first = elem;
    
        } 
     
        public boolean delete(int val) {
    
            boolean found = false;
           
            if (this.isEmpty())
    	    return false;
    
            if (first.equals(val)) {
               // L'elemento cercato e` il primo, quindi devo
               // modifiare first
               first = first.getNext();
               found = true;
            }
            else {
               // L'elemento cercato non e` il primo, devo modificare
               // un elemento generico
               ListElem iterator = first;
               while ((iterator.getNext()) != null && !found)
                   if ((iterator.getNext()).equals(val)) {
                       iterator.setNext((iterator.getNext()).getNext());
                       found = true;
                   }
                   else 
                       iterator = iterator.getNext();
            }
            return found; 
    
        }
    
        public boolean delete_bis(int val) {
    
            if (first.equals(val)) {
                // L'elemento cercato e` il primo, quindi devo
                // modifiare first
                first = first.getNext();
                return true;
            }
            else {
                // L'elemento cercato non e` il primo, devo modificare
                // un elemento generico
                ListElem iterator = first;
                while ((iterator.getNext()) != null)
                    if ((iterator.getNext()).equals(val)) {
                        iterator.setNext((iterator.getNext()).getNext());
                        
                        return true;
                    }
                    else 
                        iterator = iterator.getNext();
            }
            return false; 
        }
    
        public boolean isEmpty() {
            return first == null;
        }
    
        public boolean member(int val) {
            ListElem iterator = first;
            boolean found = false;
            while ((iterator != null) && !found) 
                if (iterator.equals(val))
                    found = true; 
                else
                    iterator = iterator.getNext();
            return found; 
        }
    
        // Alternativa all'utilizzo di found
        public boolean member_bis(int val) {
            ListElem iterator = first;
            while ((iterator != null)) 
                if (iterator.equals(val))
                    return true;
                else
                    iterator = iterator.getNext();
            return false; 
        }
    
        public void printList() {
            ListElem iterator = first;
            System.out.print("Elementi: ");
            while (iterator != null) {
                System.out.print(iterator.getDato() + ",");
                iterator = iterator.getNext();
            }
            System.out.println("");
        }  
    
        public void draw() {
            ListElem iterator = first;
            if (first == null)
                System.out.print("this_MiaLista-->[|first==null|]");
            else
                System.out.print("this_MiaLista-->[|first|]");
            while (iterator != null) {
                System.out.print("-->");
                iterator.draw();
                iterator = iterator.getNext();
            }
            System.out.println("");
        }  
    
        // Altri metodi un po' piu` specializzati
        
        public void insertFirst(int val) {
            insert(val);
        }
     
        public void insertLast(int val) {
    
            ListElem elem = new ListElem();
            elem.setDato(val);
    
            if (first == null) 
                first = elem;
            // Alternativa:
            // if (isEmpty()) 
            //    insertFirst(val);
            else {
                ListElem iterator = first;
                while (iterator.getNext() != null)
                    iterator = iterator.getNext();
                iterator.setNext(elem);
            }
            
        }        
    
        public boolean deleteFirst() {
    
            if (first == null) 
            // Alternativa:
            // if (isEmpty()) 
                return false;
            else {
                first = first.getNext();
                return true;
            }    
            
        }
    
        public boolean deleteLast() {
            if (first == null)
            // Alternativa:
            // if (isEmpty()) 
                return false;
            else if (first.getNext() == null) {
                // Ha un solo elemento, devo modificare first!
                first = first.getNext();
                // Alternativa:
                // first = null;
                // Altra alternativa:
                // deleteFirst();
                return true;
            }
            else {
                ListElem iterator = first;
                while (iterator.getNext().getNext() != null) 
                    iterator = iterator.getNext();
                iterator.setNext(null);
                return true;
            }
        }
    
        // I due metodi successivi sono un po' problematici per
        // via delle situazioni di errore che non possono essere
        // segnalate coerentemente con un valore di ritorno opportuno
        public int getFirstDato() {
            return first.getDato();
        }
    
        public int getLastDato() {
            ListElem iterator = first;
            while (iterator.getNext() != null)
                iterator = iterator.getNext();
            return iterator.getDato();
        }
    }

  4. #4
    Una possibile soluzione può essere questa:
    codice:
    public boolean cancellaTuttiMinoriDopoVal(int val) {
        if ( first == null )
            return false; // oppure lanci un'eccezione..
    
        boolean flag = false;
        for (ListElem e = this.first; e != null; e = e.getNext()) {
             if( e.getDato() == val )
                 flag = true;
    
             if( flag && e.getDato() < val )
                 this.delete( e.getDato() );
        }
    
        return flag;
    }
    fai una prova, perchè non ho modo di testare.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    205
    Originariamente inviato da VincenzoTheBest
    Una possibile soluzione può essere questa:
    codice:
    public boolean cancellaTuttiMinoriDopoVal(int val) {
        if ( first == null )
            return false; // oppure lanci un'eccezione..
    
        boolean flag = false;
        for (ListElem e = this.first; e != null; e = e.getNext()) {
             if( e.getDato() == val )
                 flag = true;
    
             if( flag && e.getDato() < val )
                 this.delete( e.getDato() );
        }
    
        return flag;
    }
    fai una prova, perchè non ho modo di testare.
    Grazie per la risposta! non funziona bene però

    es:

    lista 12 - 6 - 15 - 18 - 12 - 7 -87 gli passo come valore 15 e mi restituisce
    lista 6 - 15 - 18 - 12 - 87
    quando dovrebbe darmi: lista 6 - 12 - 15 - 18 - 87

  6. #6
    Originariamente inviato da Uccio87
    Grazie per la risposta! non funziona bene però

    es:

    lista 12 - 6 - 15 - 18 - 12 - 7 -87 gli passo come valore 15 e mi restituisce
    lista 6 - 15 - 18 - 12 - 87
    quando dovrebbe darmi: lista 6 - 12 - 15 - 18 - 87
    In effetti il delete elimina la prima occorrenza di 12 non sapendo che in realtà deve essere eliminata la seconda.
    Quindi dovresti provare ad effettuare una eliminazione senza usare delete.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    205
    Così funziona perfettamente se non ho due numeri minori vicini:
    codice:
    public boolean cancellaTuttiMinoriDopoVal(int val) {
        if ( first == null )
            return false; // oppure lanci un'eccezione..
    
        boolean flag = false;
        ListElem iterator = first;
    
        while(iterator.next != null) {
             if( iterator.dato == val ) {
                 flag = true;}
    
             if( flag && iterator.next.dato < val ) {
                 iterator.next=iterator.next.next;//così cancella però non due numeri consecutivi
            }
              iterator=iterator.next;
        }
    
    
        return flag;
    }

  8. #8
    Originariamente inviato da Uccio87
    Così funziona perfettamente se non ho due numeri minori vicini
    Ok però un algoritmo deve funzionare in ogni caso

    Aggiungendo il ramo else dovrebbe andare:
    codice:
    public boolean cancellaTuttiMinoriDopoVal(int val) {
        if ( first == null )
            return false; // oppure lanci un'eccezione..
    
        boolean flag = false;
        ListElem iterator = first;
    
        while(iterator.next != null) {
             if( iterator.dato == val )
                 flag = true;
    
             if( flag && iterator.next.dato < val )
                 iterator.next = iterator.next.next;
             else 
                 iterator=iterator.next;
        }
    
        return flag;
    }

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    205

    [Risolto]

    Perfetto funziona alla grande!!!!
    Grazie mille per l'aiuto

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.