ArrayList + contains - prosty błąd

0

Witam ponownie. Gdzieś robię prosty błąd, ale już się zamotałem i nie wiem gdzie...
Program ma pytać o wyraz i dodawać go do ArrayList do momentu, aż drugi raz podamy ten sam wyraz.
Coś namotałem w pętli i program nie przerywa petli. Będę wdzięczny za pomoc:

import java.util.*;

public class Arraje {
	public static void main(String[] args) {
		ArrayList<String> words = new ArrayList<String>();
		Scanner in = new Scanner(System.in);
		String word;
		do{
		System.out.print("Podaj wyraz: ");
		word = in.nextLine();
		words.add(word);
		}
		while (words.contains(word));
		System.out.println("Użyłeś słowa " + word + " po raz drugi");
		}
	}	
2

Program nie przerywa pętli bo masz tak coś w stylu:

do
{
	dodaj wejście do listy
} while(wejście w liście)

Co oznacza że cokolwiek dodasz będzie w liście a więc warunek zawsze będzie true.
Z drugiej strony jeżeli zanegujesz to, to pętla wykona się tylko raz.

Więc należy zmodyfikować kod tak aby dodawał wyraz do listy tylko wtedy kiedy nie ma go w liście.
Można to zrobić na kilka sposobów. Na przykład:

String word = "";
do
{
	words.add(word); // Czyli przy 1 iteracji dodajemy pusty string
	System.out.print("Podaj wyraz: ");
	word = in.nextLine();
} while(!words.contains(word)); // Tak długo jak nie będzie tego wyrazu w liście wykonuj pętle.

Tutaj wadą tego kodu jest to że 1-szym element jest "". Więc zostawiam udoskonalanie kodu dla Ciebie.

Można byłoby zrobić też coś typu

String word;
while(true)
{
	System.out.println("Podaj wyraz: ");
	word = in.nextLine();
	
	// Sprawdzamy czy istnieje już w liście
	if(words.contains(word))
	{
		// Komunikat o błędzie?
		break; // Wyjście z pętli
	}
	else
	{
		words.add(word);
	}
}
1

Metoda contains korzysta z metody equals. A metoda equals w klasie String porównuje referencje, a nie zawartość.

0

@atmal: dzięki :)
@bogdans: i stąd właśnie mój błąd :) Wielkie dzięki, bo ważne dla mnie jest, żeby zrozumieć dlaczego jest źle :)

0

bogdans, jesteś pewien, że equals porównujemy referencję, a nie przypadkiem tym == ?

0

metoda equlas w klasie String porównuje referencje, a nie zawartość

@bogdans: o_O

    /**
     * Compares this string to the specified object.  The result is {@code
     * true} if and only if the argument is not {@code null} and is a {@code
     * String} object that represents the same sequence of characters as this
     * object.
     *
     * @param  anObject
     *         The object to compare this {@code String} against
     *
     * @return  {@code true} if the given object represents a {@code String}
     *          equivalent to this string, {@code false} otherwise
     *
     * @see  #compareTo(String)
     * @see  #equalsIgnoreCase(String)
     */
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
0

No to teraz muszę się w to zagłębić :) heheh - nie powiem, że ogarniam, ale nikt nie mówił, że będzie łatwo :-P

1 użytkowników online, w tym zalogowanych: 0, gości: 1