• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

pętla while działa w nieskończoność

0 głosów
414 wizyt
pytanie zadane 31 maja 2019 w Java przez Łukasz880525 Początkujący (250 p.)
edycja 31 maja 2019 przez Łukasz880525

Witam. Program " z klawiatury " pobiera łańcuch znaków a następnie skraca go ( generuje losowy skrót). Wszystko zapisywane jest do " bazy\pamieci". Jezeli wprowadzimy łańcuch znaków który już wystepuje w bazie to program wypisuje go wraz z wygenerowanym wcześniej skrótem. Skróty nie mogą sie powtarzać.  Problem polega na tym że gdy nie ma możliwości wygenerowania nowego skrótu to pętla while wykonuje się w nieskończoność. Jak rozwiązać taki problem ? tzn. jak prawidłowo zakończyć działanie programu ? ewentualnie jak wypisać komunikat informujący o tym że coś jest nie tak z działaniem programu ?

 

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;

public class SkracaczLinkow
{

    public static Map<String, String> bazaGlowna = new HashMap<>();
    static String Url;
    static String skrot;

    public static void main(String[] args)
    {  
        do
        {
            pobierzUrl();
            
            if(!Url.contains("o"))
            {
                bazaUrli();
                wypiszBaze();
            }
        }
        while (!Url.contains("o"));
    }

    public static void pobierzUrl()
    {
        System.out.println("podaj Url:  ");
        Scanner scanner = new Scanner(System.in);
        Url = scanner.nextLine();
    }

    public static String bazaUrli()
    {
        for (String entry : bazaGlowna.keySet())
        {
            if (Url.equals(entry))
            {
                return entry;
            }
        }

        bazaGlowna.put(Url, losujSkrut());

        return Url;
    }

    public static void wypiszBaze()
    {
        System.out.println(Url + " " + bazaGlowna.get(Url));
        System.out.println(bazaGlowna);
    }

    public static String losujSkrut()
    {
            Random random = new Random();
            char tab[] = { 'a', 'b', 'c', 'd' };
            skrot = String.valueOf(tab[random.nextInt(tab.length)]);
            int i=0;

                while (bazaGlowna.containsValue(skrot))
                {

                    // W TYM MIEJSCU MAM PROBLEM
                    
                    // -  jak nie ma możliwości wygenerowania nowego skrótu
                    // to pętla while wykonuje się w nieskończoność.
                    

                        skrot = String.valueOf(tab[random.nextInt(tab.length)]);

                    
                    // problem rozwiązałem w ten sposób:
                        
                    i ++;
        
 // jezeli po 10 razie nie wylosuje innego skrotu to zakonczy program

                    if(i>10) 
                    {
                        System.exit(0);
                    }
                    
                    
                    // czy istnieje lepsze rozwiązanie ????
                    
                }

            return skrot;
    }
}

 

1 odpowiedź

+1 głos
odpowiedź 31 maja 2019 przez Arkadiusz Fajdek Dyskutant (9,450 p.)
wybrane 1 czerwca 2019 przez Łukasz880525
 
Najlepsza

Nie wdając się bardzo w całą logikę - nie kombinujesz źle. Istnieją przypadki w których jest możliwe wykonanie tylko X prób jakiegoś zadania, jeśli się nie uda, najczęściej jest rzucany wyjątek z opisem.

W Tym ifie możesz zrobić 

throw new RuntimeException("Przekroczono maksymalną ilość prób wygenerowania Skrótu");

 

Podobne pytania

0 głosów
3 odpowiedzi 482 wizyt
pytanie zadane 24 listopada 2018 w Java przez Dudek Początkujący (370 p.)
0 głosów
1 odpowiedź 560 wizyt
pytanie zadane 20 października 2018 w Java przez mn130496 Gaduła (3,640 p.)
0 głosów
2 odpowiedzi 870 wizyt
pytanie zadane 18 lutego 2017 w Java przez Wolfy Nowicjusz (180 p.)

93,788 zapytań

142,753 odpowiedzi

323,429 komentarzy

63,393 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...