Java-функция, похоже, портит консоль, после вызова функции ничего не будет распечатано - PullRequest
0 голосов
/ 22 ноября 2018

Меня попросили запрограммировать метод, который получает сканер и возвращает отсортированный массив слов, который содержит только буквы, без повторений (и длиной не более 3000).Затем меня попросили запрограммировать метод, который проверяет, содержится ли определенная строка в данном словаре.Я использовал простой метод двоичного поиска.Вот что я сделал:

public static String[] scanVocabulary(Scanner scanner){       
		String[] array= new String[3000];
		int i=0;
		String word;
		while (scanner.hasNext() && i<3000) {
			word=scanner.next();
			if (word.matches("[a-zA-Z]+")){
				array[i]=word.toLowerCase();
				i++;
			}
		}int size=0;
		while (size<3000 && array[size]!=null ) {
			size++;
		}
		String[] words=Arrays.copyOf(array, size);
		if (words.length==0 || words.length==1) {
			return words;
		}
		else {
			Arrays.sort(words);
			int end= removeDuplicatesSortedArr(words);
			return Arrays.copyOf(words, end);
		}

	}
	
	private static int removeDuplicatesSortedArr(String[] array) { //must be a sorted array. returns size of the new array
		int n= array.length;
		int j=0;
		for (int i=0; i<n-1; i++) {
			if (!array[i].equals(array[i+1])) {
				array[j++]=array[i];
			}
		}
		array[j++]=array[n-1];
		return j;
	}
	
	public static boolean isInVocabulary(String[] vocabulary, String word){ 
		//binary search
		int n=vocabulary.length;
		int left= 0;
		int right=n-1;
		while (left<=right) {
			int mid=(left+right)/2;
			if (vocabulary[mid].equals(word)){
				return true;
			}
			else if (vocabulary[mid].compareTo(word)>0) {
				right=mid-1;
			}else {
				right=mid+1;
			}
		}
		return false;
	}

при попытке следующего кода:

public static void main(String[] args) {

        String vocabularyText = "I look at the floor and I see it needs sweeping while my guitar gently weeps";
        Scanner vocabularyScanner = new Scanner(vocabularyText);
        String[] vocabulary = scanVocabulary(vocabularyScanner);
        System.out.println(Arrays.toString(vocabulary));

        boolean t=isInVocabulary(vocabulary, "while");
        System.out.println(t);
        System.out.println("123");

    }

Я не получаю ничего, кроме ...

[and, at, floor, gently, guitar, i, it, look, my, needs, see, sweeping, the, weeps, while]

больше ничего не распечатывается ивернулся.Обе функции работают нормально, поэтому я не понимаю, что делаю неправильно.Буду очень рад услышать ваши мысли, заранее спасибо :)

1 Ответ

0 голосов
/ 22 ноября 2018

Это не имеет ничего общего с консолью.Ваш метод isInVocabulary вводит бесконечный цикл в этом блоке:

    if (!isInVocabulary(vocabulary, "while")) {
        System.out.println("Error");
    }

Если бы вы отлаживали через isInVocabulary, вы увидите, что после нескольких итераций цикла while,

left = 0;
right = 2;

mid = 1;

if (vocabulary[mid].equals(word)){
    // it doesn't
} else if (vocabulary[mid].compareTo("while") > 0) {
    // it doesn't
} else {
    right = mid + 1;
    // this is the same as saying right = 1 + 1, i.e. 2
}

Так что вы будете зацикливаться вечно.

...