2012-10-18 4 views
14

Powiel możliwe:
Declaring an array of unknown sizeJak zadeklarować tablicę ciągów o nieznanym rozmiarze?

Pracuję w Javie i próbuję wprowadzić karę do tablicy ciągów. Ja tokenizuję i ustalam liczbę słów. Jednak muszę dodać każde słowo do tablicy łańcuchów, aby określić, czy istnieją duplikaty, czy nie. Nie wiem, jak zainicjować moją tablicę, jeśli nie znam liczby słów do końca programu.

//Declares variables 
    Scanner scan = new Scanner (System.in); 
    int withoutdup = 0, wordCount = 0; 
    String line, word; 
    StringTokenizer tokenizer; 
    List<String> sentence = ArrayList<String>; 

    //Asks user for input 
    System.out.println ("Please enter text. Enter DONE to finish."); 
    line = scan.next(); 


    //Tokenizes the string and counts the number of character and words 
while (!line.equals("DONE")) 
{ 
    tokenizer = new StringTokenizer (line); 
    while (tokenizer.hasMoreTokens()) 
    { 
     word = tokenizer.nextToken(); 
     wordCount++; 
     sentence += word; 
    } 
    line = scan.next(); 
} 
+0

następnie należy użyć ArrayList zamiast tego, a na końcu nadal można przekonwertować do tablicy ... – Naytzyrhc

Odpowiedz

27

użyć ArrayList zamiast

List<String> list = new ArrayList<String>(); 

rośnie automatycznie.

Aby sprawdzić duplikaty, można użyć Set (HashSet), nie pozwala na powielanie elementów.

Aktualizacja

widzę parę problemów w kodzie:

List<String> sentence = ArrayList<String>; 

Ty brakuje new po =.

sentence += word; 

To będzie działać tylko jeśli sentence był String. Jest to List więc trzeba zastosować metodę List.add tam

sentence.add(word); 

teraz również wordCount++; jest zbędny sentence.size() powie, ile słów.

+0

Niestety jestem całkiem nowy, ale to, co mam w odniesieniu do wprowadzania zdanie: System. out.println ("Proszę wpisać tekst, wpisz DONE, aby zakończyć."); line = scan.next(); while (! Line.equals ("DONE")) { tokenizer = nowy StringTokenizer (linia); podczas (tokenizer.hasMoreTokens()) { słowo = tokenizer.nextToken(); wordCount ++; } line = scan.next(); } Jak zadeklarować listę tablic, ponieważ lista sentence = ArrayList (); nie działa? – user1755178

+0

@ user1755178: Czy możesz zaktualizować samo pytanie za pomocą kodu? –

+0

Tak, właśnie zrobiłem – user1755178

2

Użyj struktury, która może się skurczyć i rozwijać w razie potrzeby, na przykład: ArrayList.

2

Nie możliwe, tablice są stałej długości. Lepiej używać implementacji java.util.List jak ArrayList,LinkedList itd ...

Jeśli chcesz kontynuować z tablicą, możesz użyć tej funkcji do zmiany rozmiaru tablicy, ale znowu tutaj utworzy nową tablicę z nowym rozmiarem i skopiuje poprzednią wartość tablic .

private static Object resizeArray (Object oldArray, int newSize) { 
    int oldSize = java.lang.reflect.Array.getLength(oldArray); 
    Class elementType = oldArray.getClass().getComponentType(); 
    Object newArray = java.lang.reflect.Array.newInstance(
     elementType, newSize); 
    int preserveLength = Math.min(oldSize, newSize); 
    if (preserveLength > 0) 
     System.arraycopy(oldArray, 0, newArray, 0, preserveLength); 
    return newArray; 
} 
6

prostu patrz poniższy przykład, masz pomysł na temat sposobu deklarowania tablicy ciągów o nieznanej wielkości.

Najpierw użyj ArrayList do przechowywania ciągów i za każdym razem wywołaj metodę .add, aby zwiększyć rozmiar ArrayList o jeden element. Podczas wypełniania tablicy ArrayList należy użyć metody size() ArrayList i utworzyć jej tablicę String, a następnie ją zmienić. Ale upewnij się, że każdy element w ArrayList jest obiektem, dlatego musisz przekonwertować każdy element na ciąg.

Przykład:

ArrayList list = new ArrayList(); 

for(int i = 0; i < 100; i++) 

list.add("stuff"); 

String[] strArray = new String[ list.size() ]; 

for(int j = 0; j < strArray.length; j++) 

strArray[ j ] = list.get(j).toString(); 

nadzieję, że to pomoże. To tylko jeden ze sposobów, ale myślę, że może istnieć inny skuteczniejszy sposób, dzięki któremu możesz zrobić to samo.