Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

[Java] sortowanie/usunięcie wpisu z samemu zrobionej listy jednokierunkowej

#1
[Java] sortowanie/usunięcie wpisu z samemu zrobionej listy jednokierunkowej
Witam!
Mam za zadanie stworzyć bazę danych za pomocą listy jednokierunkowej, którą sam napiszę. Baza ma posiadać funkcję dodawania rekordów, wyszukiwanie, sortowanie (bez przechodzenia na etap przepisywania) i usuwanie pojedynczych wpisów (wyszukiwanie i sortowanie ma się odbywać z użyciem interfejsu Comparable). Mam problem z dwoma ostatnimi rzeczami. przy usuwaniu próbowałem zrobić tak, żeby dana wartość elementu listy była zmieniana na null, ale wyskakiwał mi NullPointerException. Potem myślałem, że może zmienić dany element następnym, a następny jeszcze następnym itd., ale chyba nie wiem jak to zrobić dobrze (tak, to jest ta ostatnia nieudolnie napisana metoda w klasie) :D Mógłby mnie ktoś nakierować jak to zrobić? Jeśli chodzi o sortowanie, to jedynym wyjściem jest Collections.sort?

http://pastebin.com/ufsS5zqj
 System operacyjny: windows_ten Przeglądarka: chrome
#2
RE: [Java] sortowanie/usunięcie wpisu z samemu zrobionej listy jednokierunkowej
Możesz umieścić tutaj ten kod? Niestety w pracy mam wszystko poblokowane i nie mam jak tego obejrzeć.
 System operacyjny: windows_seven Przeglądarka: firefox
#3
RE: [Java] sortowanie/usunięcie wpisu z samemu zrobionej listy jednokierunkowej
(24.06.2016, 08:37)koneton napisał(a): Możesz umieścić tutaj ten kod? Niestety w pracy mam wszystko poblokowane i nie mam jak tego obejrzeć.

Kod:
import java.util.*;

public class dowodyOsobiste {
    private poleceniaDoListy bazaDowodowOsobistych;
    
    public static void main(String[] args){
        dowodyOsobiste aplikacja = new dowodyOsobiste();
        
        System.out.println("");
        System.out.println("<<twoja osobista baza dowodow osobistych>>");
        
        aplikacja.menuAplikacji();
    }
    
    public dowodyOsobiste() {
        bazaDowodowOsobistych = new poleceniaDoListy();
    }
    
    public String wprowadzanieTekstu(String tekstZachety){
        Scanner skaner = new Scanner(System.in);
        
        System.out.println(tekstZachety);
        String tekst = skaner.nextLine();
        
        return tekst;
    }
    
    public void dopiszRekordMenu(){
        String nazwisko;
        String imiona;
        
        nazwisko = wprowadzanieTekstu("wprowadz nazwisko: ");
        imiona = wprowadzanieTekstu("wprowadz imiona");
        
        try{
            bazaDowodowOsobistych.dopiszDoListy(nazwisko, imiona);
        } catch(wyjatkiDowodowOsobistych ex){
            System.out.println(ex);
        }
        
        menuAplikacji();
    }
    
    public void znajdzNazwiskoMenu(){
        String nazwisko = wprowadzanieTekstu("wprowadz szukane nazwisko: ");
        listaDowodowOsobistych znalezionyRekord = bazaDowodowOsobistych.znajdzNazwisko(nazwisko.trim());
        
        if(znalezionyRekord == null)
            System.out.println("brak rekordow");
        else
            System.out.println(znalezionyRekord);
        menuAplikacji();
    }
    
    public void znajdzImionaMenu(){
        String imiona = wprowadzanieTekstu("wprowadz szukane imiona: ");
        listaDowodowOsobistych znalezionyRekord = bazaDowodowOsobistych.znajdzImiona(imiona.trim());
        
        if(znalezionyRekord == null)
            System.out.println("brak rekordow");
        else
            System.out.println(znalezionyRekord);
        
        menuAplikacji();
    }
    
    public void pokazBazeMenu(){
        System.out.println("");
        System.out.println("<<poczatek bazy>>");
        bazaDowodowOsobistych.pokazListe();
        menuAplikacji();
    }
    
    public void usunBazeMenu(){
        bazaDowodowOsobistych.usunCalaListe();
    }
    
    public void usunWpisMenu(){
        String nazwisko = wprowadzanieTekstu("nazwisko");
        String imiona = wprowadzanieTekstu("imiona");
        
        bazaDowodowOsobistych.usunWpisJeden(nazwisko, imiona);
        
        menuAplikacji();
    }
    

    
    public void menuAplikacji(){
        String opcja;
        
        do{
            System.out.println("");
            System.out.println("wybierz:");
            System.out.println(">1 by dopisac rekord do bazy");
            System.out.println(">2 by pokazac zawartosc bazy");
            System.out.println(">3 by usunac baze");
            System.out.println(">4 by wyszukac nazwisko");
            System.out.println(">5 by wyszukac imiona");
            System.out.println(">koniec by zakonczyc dzialanie programu");
            
            opcja = wprowadzanieTekstu("");
            
            if(opcja.compareTo("1") == 0)
                dopiszRekordMenu();
            if(opcja.compareTo("2") == 0)
                pokazBazeMenu();
            if(opcja.compareTo("3") == 0)
                usunBazeMenu();
            if(opcja.compareTo("4") == 0)
                znajdzNazwiskoMenu();
            if(opcja.compareTo("5") == 0)
                znajdzImionaMenu();
            if(opcja.compareTo("koniec") == 0){
                System.out.println("");
                System.out.println("!!! dziekujemy za skorzystanie z naszych uslug !!!");
                break;
            }
        }while(opcja.compareTo("")==0);
    }
}

Kod:
public class wyjatkiDowodowOsobistych extends Exception {
    public static final int brakBledu = 0;
    public static final int brakNazwiskoPodane = 1;
    public static final int brakImionaPodane = 2;
    public static final int brakNieWiadomoCzego = 15;
    private int rodzajBledu;
    
    public wyjatkiDowodowOsobistych(int blad) {
        super("wyjatek bazy dowodow osobistych");
        
        ustalRodzajBledu(blad);    
    }
    
    private void ustalRodzajBledu(int blad) {
            if(blad>= brakBledu && blad < brakNieWiadomoCzego)
                this.rodzajBledu = blad;
            else
                this.rodzajBledu = brakNieWiadomoCzego;
    }
    
    public int getRodzajBledu() {
        return rodzajBledu;
    }
    
    public String toString() {
        String opis = "";
        
        if(rodzajBledu == brakNazwiskoPodane)
            opis = "brak nazwiska";
        if(rodzajBledu == brakImionaPodane)
            opis = "brak imion";
        if(rodzajBledu == brakNieWiadomoCzego)
            opis = "brak nie wiadomo czego";
        
        return opis;
    }
}

Kod:
import java.util.*;

public class listaDowodowOsobistych {
   protected String nazwisko;
    protected String imiona;
    private listaDowodowOsobistych nastepnyDowod;
    Scanner skan = new Scanner(System.in);
    String odp;
    
    public listaDowodowOsobistych(String nazwisko, String imiona) {
        this.nazwisko = nazwisko;
        this.imiona = imiona;
        
        nastepnyDowod = null;
    }
    
    public String toString() {
        return "dane: "+nazwisko+" "+imiona;
    }
    
    public void dopiszDoKonca(String nazwisko, String imiona) {
        if(nastepnyDowod == null)
            nastepnyDowod = new listaDowodowOsobistych(nazwisko, imiona);
        else
            nastepnyDowod.dopiszDoKonca(nazwisko, imiona);
    }

    public listaDowodowOsobistych szukajPoNazwisku(String nazwisko) {
        listaDowodowOsobistych znalezionyRekord = null;
        
        if(this.nazwisko.compareTo(nazwisko) == 0)
            znalezionyRekord = new listaDowodowOsobistych(this.nazwisko, this.imiona);
        else
            if(nastepnyDowod != null)
                znalezionyRekord = nastepnyDowod.szukajPoNazwisku(nazwisko);
        return znalezionyRekord;    
    }
    
    public listaDowodowOsobistych szukajPoImionach(String imiona){
        listaDowodowOsobistych znalezionyRekord = null;
        
        if(this.imiona.compareTo(imiona) == 0) {
            znalezionyRekord = new listaDowodowOsobistych(this.nazwisko, this.imiona);
            /*System.out.println("znaleziono "+znalezionyRekord.nazwisko + " "+znalezionyRekord.imiona +". czy chcesz usunac?");
            String odp = skan.nextLine();
            if (odp.compareTo("tak") == 0) {
                System.out.println("wpisales tak");
                this.nazwisko = null;
                this.imiona = null;
                this.nastepnyDowod = null;
            }
            else
                System.out.println("nie wpisales tak");*/
        }
        else
            if(nastepnyDowod != null)
                znalezionyRekord = nastepnyDowod.szukajPoImionach(imiona);
        return znalezionyRekord;
    }
    
    public String getNazwisko() {
        return nazwisko;
    }
    
    public String getImiona() {
        return imiona;
    }
    
    public void pokazListe() {
        System.out.println(this);        
        if(nastepnyDowod != null)
            nastepnyDowod.pokazListe();
        if(nastepnyDowod == null)
            System.out.println(">>koniec bazy<<");
    }
    
    public void usunListe() {
        if(nastepnyDowod != null)
            nastepnyDowod.usunListe();
        
        nastepnyDowod = null;
    }
    
    public void usunWpis(String nazwisko, String imiona) {
        listaDowodowOsobistych wpis;
        if(this.imiona.compareTo(imiona) == 0 && this.nazwisko.compareTo(nazwisko) == 0){
            this.nazwisko=null;
            this.imiona = null;
        }
        else
        nastepnyDowod.usunWpis(nazwisko, imiona);
    }
}

Kod:
import java.util.*;

public class poleceniaDoListy{
    private listaDowodowOsobistych listaDowodow;
    
    public poleceniaDoListy(){
        listaDowodow = null;
    }
    
    public String wprowadzanieTekstu(String tekstZachety){
        Scanner skaner = new Scanner(System.in);
        
        System.out.println(tekstZachety);
        String tekst = skaner.nextLine();
        
        return tekst;
    }
    
    public void dopiszDoListy(String nazwisko, String imiona) throws wyjatkiDowodowOsobistych {
        String nazwiskoTrim = nazwisko.trim();
        String imionaTrim = imiona.trim();
        
        if (nazwiskoTrim.compareTo("") == 0)
            throw new wyjatkiDowodowOsobistych(wyjatkiDowodowOsobistych.brakNazwiskoPodane);
        if (imionaTrim.compareTo("") == 0)
            throw new wyjatkiDowodowOsobistych(wyjatkiDowodowOsobistych.brakImionaPodane);
        
        if(listaDowodow == null)
            listaDowodow = new listaDowodowOsobistych(nazwiskoTrim, imionaTrim);
        else
            listaDowodow.dopiszDoKonca(nazwiskoTrim, imionaTrim);
    }
    
    public listaDowodowOsobistych znajdzNazwisko(String nazwisko){
        listaDowodowOsobistych znalezionyRekord = null;
        
        if(listaDowodow != null)
            znalezionyRekord = listaDowodow.szukajPoNazwisku(nazwisko);
        
        return znalezionyRekord;    
    }
    
    public listaDowodowOsobistych znajdzImiona(String imiona){
        listaDowodowOsobistych znalezionyRekord = null;
        
        if(listaDowodow != null)
            znalezionyRekord = listaDowodow.szukajPoImionach(imiona);
        
        return znalezionyRekord;
    }
    
    public void pokazListe(){
        if(listaDowodow == null)
            System.out.println("baza jest pusta");
        else
            listaDowodow.pokazListe();
    }
    
    public void usunWpisJeden(String nazwisko, String imiona){
        listaDowodow.usunWpis(nazwisko, imiona);
    }
    

    public void usunCalaListe() {
        if(listaDowodow != null) {
            listaDowodow.usunListe();
            
            listaDowodow = null;
        }
    }
}
 System operacyjny: windows_ten Przeglądarka: chrome
#4
RE: [Java] sortowanie/usunięcie wpisu z samemu zrobionej listy jednokierunkowej
Zrobiłem to co ty, tylko trochę inaczej. Klasa List posiada referencję do head, czyli głowy (początku) listy i udostępnia wszystkie metody, które są Ci potrzebne.

Jeżeli chcesz wykorzystać Collections.sort to musisz implementować interfejs List.

Dodawanie elementu:
-jeżeli head jest null to wstaw element jako head
-jeżeli head nie jest null, to znajdź ostatni i ustaw w nim referencję do następnego jako dodawany element

Usuwanie elementu:
-Przeszukuj całą listę po kolei, przechowując referencję do poprzedniego i obecnego elementu. Jeżeli znajdziesz element do usunięcia, to przepisz referencję z następnika obecnego, do następnika poprzedniego
(Uwaga! Usuwanie nie kończy się po pierwszym znalezionym rekordzie, aby usunęło tylko jeden rekord dodaj break po pierwszym usuniętym)

Sortowanie:
-Do sortowania użyłem prostego algorytmu przez wstawienie (znalezienie jego implementacji w internecie jest proste, a sam algorytm łatwo zrozumiały).

Lista imion:
-Przeszukuję całą listę i jeżeli imię jest takie samo, dodaje je do zwracanej listy rekordów



Kod:
/**
* Created by Aleksander on 2016-08-28.
*/
public class Id{

   private String name;
   private String surname;

   public Id(String name, String surname) {
       this.name = name;
       this.surname = surname;
   }

   public String getName() {
       return name;
   }

   public String getSurname() {
       return surname;
   }

   @Override
   public boolean equals(Object o) {
       if(this == o)
           return true;
       if(o == null || getClass() != o.getClass())
           return false;

       Id id = (Id) o;

       if(name != null ? !name.equals(id.name) : id.name != null)
           return false;
       return surname != null ? surname.equals(id.surname) : id.surname == null;

   }

   @Override
   public int hashCode() {
       int result = name != null ? name.hashCode() : 0;
       result = 31 * result + (surname != null ? surname.hashCode() : 0);
       return result;
   }

   @Override
   public String toString() {
       return "Id{" +
               "name='" + name + '\'' +
               ", surname='" + surname + '\'' +
               '}';
   }

   public int compareByName(Id o) {
       return name.compareTo(o.getName());
   }
}


Kod:
/**
* Created by Aleksander on 2016-08-28.
*/
public class Ids {

   private Id id;
   private Ids next;

   public void setId(Id id) {
       this.id = id;
   }

   public Ids(Id id) {
       this.id = id;
   }

   public void setNext(Ids next) {
       this.next = next;
   }

   public Id getId() {
       return id;
   }

   public Ids getNext() {
       return next;
   }

}


Kod:
/**
* Created by Aleksander on 2016-08-28.
*/
public class IdsList {

   private Ids head;

   public IdsList() {
   }

   public void addId(Id id) {
       if(head == null)
           head = new Ids(id);
       else{
           Ids current = head;
           Ids temp = new Ids(id);
           while(current.getNext() != null)
               current = current.getNext();
           current.setNext(temp);
       }
   }

   public void remove(Id id) {
       Ids current = head;
       Ids prev = current;
       while(current != null) {
           if(current.getId().equals(id)) {
               if(current == head)
                   head = current.getNext();
               else
                   prev.setNext(current.getNext());
           }
           prev = current;
           current = current.getNext();
       }
   }

   public void sortByName() {
       Ids i = head;
       while(i != null) {
           Ids min = i;
           Ids j = i.getNext();
           while(j != null){
               if(min.getId().compareByName(j.getId()) > 0)
                   min = j;
               j = j.getNext();
           }
           Id temp = min.getId();
           min.setId(i.getId());
           i.setId(temp);
           i = i.getNext();
       }

   }

   public IdsList getByName(String name) {
       IdsList idsList = new IdsList();
       Ids current = head;
       while(current != null) {
           if(current.getId().getName().equals(name))
               idsList.addId(current.getId());
           current = current.getNext();
       }
       return idsList;
   }

   public void show() {
       Ids current = head;
       while(current != null) {
           System.out.println(current.getId());
           current = current.getNext();
       }
   }
}

Kod:
/**
* Created by Aleksander on 2016-08-28.
*/
public class Main {

   public static void main(String[] args) {
       IdsList list = new IdsList();
       prepareList(list);
       list.show();



       System.out.println("\nFind Jan");
       list = new IdsList();
       prepareList(list);
       list.getByName("Jan").show();


       System.out.println("\nSort");
       list = new IdsList();
       prepareList(list);
       list.sortByName();
       list.show();

       System.out.println("\nRemove Jan Nowak");
       list = new IdsList();
       prepareList(list);
       list.remove(new Id("Jan", "Nowak"));
       list.show();
   }

   public static void prepareList(IdsList list) {
       list.addId(new Id("Jan", "Nowak"));
       list.addId(new Id("Jan", "Nowak"));
       list.addId(new Id("Janusz", "Nowak"));
       list.addId(new Id("Mateusz", "Nowak"));
       list.addId(new Id("Jan", "Nowak"));
       list.addId(new Id("Krzysztof", "Nowak"));
       list.addId(new Id("Jan", "Nowak"));
       list.addId(new Id("Jan", "Bogacki"));
   }
}
 System operacyjny: windows_seven Przeglądarka: firefox
Programy: Polecane / Nowe / Inne




Podobne wątki ([Java] sortowanie/usunięcie wpisu z samemu zrobionej listy jednokierunkowej)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  [C# WPF] Dodawanie elementów z listy do DataGrid Kamil 1 2 11675 25.05.2017, 20:03
Ostatni post: Kamil 1
  [C#] Wprowadzenie dowolnej długości listy kontaktów do programu. Ayumi 3 9328 16.02.2017, 15:52
Ostatni post: aht
  [C++] Sortowanie bąbelkowe - problem z rozwiązaniem zadania bartek164 8 10637 01.12.2016, 11:26
Ostatni post: Szachista

Skocz do: