Почему разница между ListIterator и Stream - PullRequest
0 голосов
/ 25 октября 2019

У нас есть текстовый файл Dictionary, который мы преобразовали в String [] simpleArray
Мы редко работаем с массивами, так что этот был за пределами нашей комфортной зоны
Он имеет 466552 элементов в этом формате 40 абактериальных
Когда мыпроверка слова с орфографической ошибкой происходит очень быстро
Когда мы возвращаемся к списку и проверяем правильность написания слова, которое мы использовали, ListIterator
Мы нашли результаты нечетными, исходя из условия поиска
Таким образом, мыпопытался использовать Java 8 Streams с фильтрами и лямбда

Вот результаты использования ListIterator с поиском "some"

кто-то когда-нибудь кто-нибудь, кто-то, кто-то, кто-то, Сомердейл, кто-то кувыркается
Сомерсет, Сомерсетшир, Сомерсвилль, что-то где-то когда-то
в некоторой степени, когда-то, где-то, кто-то


Вот результаты с использованиемListIterator с поисковым термином "someo" и "someon"


кто-то когда-нибудь


Вот результаты использования Steams с фильтрами и лямбда-выражения, поисковый термин "someon"

кто-то кто-то кто-то кто-то кто-то кто-то кто-то


Вопрос в том, что мы создали код ListIteratorправильно?
Пока код выполняется, он не дает надежных результатов

Мы будем признательны, если узнаем, что код потока может быть сконструирован иначе
Цельбыло добавить элементы в просмотр списка, пока результаты находятся в текстовой области
Мы не использовали просмотр списка раньше


}if(found != true){

for(indexSC = 0; indexSC < simpleArray.length;indexSC++){
if(simpleArray[indexSC].toLowerCase().contains(txtTest.getText().trim().toLowerCase())){
// array stream foreach filter results to textarea javafx
List<String> cs = Arrays.asList(simpleArray);

ArrayList list = new ArrayList<>();
cs.stream().filter(s -> s.startsWith("someon"))
  //.forEach(System.out::println); 
.forEach(list :: add);   
String aL = list.toString();
System.out.println("!!!! aL "+aL);
String La = list.toString().replace("[", "").replace("]","").replace(",", " ");
System.out.println("@@@@ Stream "+La);

txaML.appendText(La);
txaML.appendText("\n");
//list.forEach(System.out::println);


ListIterator<String> listItr = cs.listIterator();
System.out.println("%%%% Second Find "+simpleArray[indexSC]+" At indexSC "+indexSC+" L "+simpleArray[indexSC].length());
txaML.clear();
while(listItr.hasNext()){
    if(listItr.next().startsWith("someon")){

        txaML.appendText(listItr.next());
        txaML.appendText("\n");
        //txaML.appendText(listItr.next().intern());
        //txaML.appendText("\n");
        System.out.println("!!!! ListIterator "+listItr.next());
        //System.out.println("!!!!!! Next intern "+listItr.next().intern());

    }  
}

1 Ответ

0 голосов
/ 25 октября 2019

Мы были бы признательны, если бы знали, что код потока может быть сконструирован по-другому

Мы добавили несколько элементов в ваш проект, а именно ComboBox и ListView
Почему? Если вы планируете выбирать информацию, сгенерированную потоком, то TextArea является реальным препятствием для выбора элементов (Текст)
Мы заметили, что у вас есть список ArrayList, в который поток добавил данные в
Так что нет необходимостивсе это заменить код. Мы добавили прослушиватель SelectionModel в ListView

Вот код с вашим старым кодом остатка
Это все, что вам нужно для ComboBox

 public void CboSelect(){
 months = FXCollections.observableArrayList();
}

@FXML
public void getSP(){
    String selected = cboSP.getValue().toString();
    System.out.println("S S S selected "+selected); 
}

Здесьэто новое произведение искусства, ха-ха

        }if(found != true){

        lvListView.setStyle("-fx-font-size:18.0;-fx-background-color: white;");
        for(indexSC = 0; indexSC < simpleArray.length;indexSC++){
        if(simpleArray[indexSC].toLowerCase().contains(txtTest.getText().trim().toLowerCase())){
        // array stream foreach filter results to textarea javafx
        List<String> cs = Arrays.asList(simpleArray);

        ArrayList list = new ArrayList<>();
        cs.stream().filter(s -> s.startsWith("someon"))
          //.forEach(System.out::println); 
        .forEach(list :: add);   
        //String aL = list.toString();
        //System.out.println("!!!! aL "+aL);
        //La = list.toString().replace("[", "").replace("]","").replace(",", "").replace(" ", "\n");
        int L = list.size();
        for(int X = 0; X < L;X++){
        String A = (String) list.get(X);
        cboSP.getItems().add(A);
        txaML.appendText(A);
        txaML.appendText("\n");
        lvListView.getItems().add(A);
        System.out.println(" = = L "+L+" Num "+A);
        }

        lvListView.getSelectionModel().selectedItemProperty()
        .addListener((observable, oldValue, newValue) -> {
        System.out.println(newValue);});

Мы не смогли найти много информации о поведении ListIterators в отношении производительности
Мы посмотрели несколько сообщений SO о потоках, кажется,новая Java 8 вещь

...