Есть трабл, инфу по которому я никак не могу найти. Что значит (String... words) в сигнатуре метода? Почему, при передачи строки в метод, переменная words имеет под собой не содержание объекта, а его имя в формате [Ljava.lang.String;@74a14482 которое и дает мне как результат!

package com.javarush.test.level22.lesson09.task03;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

/* Составить цепочку слов
В методе main считайте с консоли имя файла, который содержит слова, разделенные пробелом.
В методе getLine используя StringBuilder расставить все слова в таком порядке,
чтобы последняя буква данного слова совпадала с первой буквой следующего не учитывая регистр.
Каждое слово должно участвовать 1 раз.
Метод getLine должен возвращать любой вариант.
Слова разделять пробелом.
В файле не обязательно будет много слов.

Пример тела входного файла:
Киев Нью-Йорк Амстердам Вена Мельбурн

Результат:
Амстердам Мельбурн Нью-Йорк Киев Вена
*/
public class Solution {
    public static void main(String[] args) throws IOException
    {
        BufferedReader filereader = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader reader = new BufferedReader(new FileReader(filereader.readLine()));
        filereader.close();
        StringBuilder temp = new StringBuilder();
        while (reader.ready())
        {
            temp.append(reader.readLine());
            temp.append(" ");
        }
        reader.close();
        temp.delete(temp.length()-1,temp.length());
        //...
        System.out.println(temp.toString());
        StringBuilder result = getLine(temp.toString());
        System.out.println(result.toString());
    }

    public static StringBuilder getLine(String... words)
    {
        String[] array = words.toString().split(" ");
        ArrayList<String> arrayList = new ArrayList<>();
        for (String s : array)
        {
            arrayList.add(s);
        }
        while (!test(arrayList))
        {
            Collections.shuffle(arrayList);
        }
        StringBuilder results = new StringBuilder();
        for (String s : arrayList)
        {
            results.append(s);
            results.append(" ");
        }
        results.delete(results.length()-1,results.length());
          return results;
    }

    public static boolean test(ArrayList<String> arrayList)
    {
        if (arrayList.isEmpty()||arrayList.size()==1)
            return true;
        for (int i = 0; i < arrayList.size()-1; i++)
        {
            String temp1b = arrayList.get(i);
            String temp2b = arrayList.get(i+1);
            temp1b = temp1b.toLowerCase();
            temp2b = temp2b.toLowerCase();
            StringBuilder temp1 = new StringBuilder(temp1b);
            StringBuilder temp2 = new StringBuilder(temp2b);
            if (!(temp2.substring(0, 1).equals(temp1.substring(temp1.length() - 1))))
            {
                return false;
            }
        }
        return true;
    }
}

задан 11 Янв, 13:37

Lezenford's gravatar image

Lezenford
2185
одобрено: 31%


Это динамический аргумент(аргумент переменной длины). Передаешь ты в конструктор/метод аргументы, один за одним "mama", "papa", "deda", "baba".

И получаешь массив с 4 элементами.

Отправляешь "mama", получаешь массив с одним элементом,

Отправляешь... ничего не отправляешь, получаешь массив с 0 элементов.

alt text

alt text

alt text

ссылка

опубликован 11 Янв, 14:10

Haart's gravatar image

Haart
4.3k110
одобрено: 46%

изменено 11 Янв, 14:22

В новом комментарии

(11 Янв, 15:04) Lezenford

Обновите код.

(11 Янв, 15:02) Haart

Добавил проверку на длину перед обрезанием последнего пробела (сразу после считывания файла) (на пустом файле там появлялась ошибка взятия подстроки). Не помогло, хотя на пустые файлы теперь не ругается - возвращает пустую строку. Попробовал вообще отказаться от обрезания лишнего пробела в конце - тоже самое, ошибки нет, но валидатор не принимает

(11 Янв, 14:59) Lezenford

Поставьте проверку на 0 элементов. Возвращать надо пусто стрингбилдер.

(11 Янв, 14:49) Haart

Так это массив с 1 элементом! Спасибо! добавил один аргумент и значения пошли нормаьные. Одно плохо - валидатор не принимает...

(11 Янв, 14:41) Lezenford

Новый код. Не принимает валидатор..

package com.javarush.test.level22.lesson09.task03;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

/* Составить цепочку слов
В методе main считайте с консоли имя файла, который содержит слова, разделенные пробелом.
В методе getLine используя StringBuilder расставить все слова в таком порядке,
чтобы последняя буква данного слова совпадала с первой буквой следующего не учитывая регистр.
Каждое слово должно участвовать 1 раз.
Метод getLine должен возвращать любой вариант.
Слова разделять пробелом.
В файле не обязательно будет много слов.

Пример тела входного файла:
Киев Нью-Йорк Амстердам Вена Мельбурн

Результат:
Амстердам Мельбурн Нью-Йорк Киев Вена
*/
public class Solution {
    public static void main(String[] args) throws IOException
    {
        BufferedReader filereader = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader reader = new BufferedReader(new FileReader(filereader.readLine()));
        filereader.close();
        StringBuilder temp = new StringBuilder();
        while (reader.ready())
        {
            temp.append(reader.readLine());
            temp.append(" ");
        }
        reader.close();
        if (temp.length()>0)
        temp.delete(temp.length()-1,temp.length());
        //...
        StringBuilder result = getLine(temp.toString());
        System.out.println(result.toString());
    }

    public static StringBuilder getLine(String... words)
    {
        String[] array = words[0].toString().split(" ");
        ArrayList<String> arrayList = new ArrayList<>();
        for (String s : array)
        {
            arrayList.add(s);
        }
        while (!test(arrayList))
        {
            Collections.shuffle(arrayList);
        }
        StringBuilder results = new StringBuilder();
        for (String s : arrayList)
        {
            results.append(s);
            results.append(" ");
        }
        results.delete(results.length()-1,results.length());
          return results;
    }

    public static boolean test(ArrayList<String> arrayList)
    {
        if (arrayList.isEmpty()||arrayList.size()<=1)
            return true;
        for (int i = 0; i < arrayList.size()-1; i++)
        {
            String temp1b = arrayList.get(i);
            String temp2b = arrayList.get(i+1);
            temp1b = temp1b.toLowerCase();
            temp2b = temp2b.toLowerCase();
            StringBuilder temp1 = new StringBuilder(temp1b);
            StringBuilder temp2 = new StringBuilder(temp2b);
            if (!(temp2.substring(0, 1).equals(temp1.substring(temp1.length() - 1))))
            {
                return false;
            }
        }
        return true;
    }
}
ссылка

опубликован 11 Янв, 15:03

Lezenford's gravatar image

Lezenford
2185
одобрено: 31%

Попробуем воспроизвести... Но вообще странно(

(12 Янв, 01:39) Lezenford

Ппц, пока тестил, забыл решение на основе вашего, только с добавлением 2 строчек. Парсило в лет. Не могу вспомнить или воспроизвести)) Правда оно все равно некорректное, но обидно.

(11 Янв, 17:24) Haart

Ну и новый СБ, если кол-во элементов с длиной списка не сойдется. Забыл добавить.

(11 Янв, 17:11) Haart
2

Вот вам алгоритм, получаете из файла строку, сохраняете в константу. Создаете список, туда добавляете элементы из строки. Сохраняете длину списка. Добавляете первый элемент в СБ(стрингбилдер). Из списка удаляете. В цикле прокручиваете оставшиеся, находите с первой буквой, которая соответствует последней из СБ, добавляете в СБ, из списка удаляете, переменную цикла на -1, цикл дальше. Как цикл завершится, сравниваете кол-во элементов(сплитСБ) с сохраненной длиной списка, если не равна - новый список из константы, шуффл и new. Ну и пока кол-во элементов и длина первоначального списка не сойдется

(11 Янв, 17:08) Haart

Хотя я наверное погнал немного) Сижу дебажу чужое решение, вместо своего)

Не обратил внимания на условие цикла, забейте на последний 2 коммента.

Сидел дебажил, так и не догнал почему шуффл в стандартной реализации не справляется. И так и сяк реализацию вертел, все ему не нравится...

(11 Янв, 16:33) Haart

предпоследний элемент будет сравниваться с последним. цикл обрабатывает последним предпоследний элемент, а сравнивает его со следующим. Или последний элемент так же нужно сравнивать? с чем то кроме предпоследнего? Какое еще условие? зачем цикл принудительно прерывать? ничего не понимаю...

(11 Янв, 16:28) Lezenford

Причем, исправление идет через break, а не через условие в цикле. Там единственное логичное место куда поставить. Ну и условие прилепить.

(11 Янв, 16:26) Haart

Смотрите, что будет на последнем элементе цикла. Пройдитесь по каждой строке.

(11 Янв, 16:23) Haart

Все равно не понимаю. Если уменьшить последовательность слов до 10 - считает за секунду и находит верную последовательность - на вашей же цепочке тестил, удалив последние 5 слов. Проверка на одно слово - есть. вернет его после первого вхождения в метод. Проверка на пустое множество тоже есть. Что ему не хватает?

(11 Янв, 16:19) Lezenford

Ну собственно у вас почти все работает, я вижу единственную ошибку. Она прям на видном месте, связана с циклом. Ошибка в методе теcт.

(11 Янв, 16:06) Haart

Я понимаю и не говорил про идевательства. Просто с этой строкой мой метод решения не подходит (из 15 слов в ряд выстраиваютс 9-10. пару раз доходило до 12) - а в других темах по этой задаче пишут именно про способ решения случайным перебором. Другого рационального метода поиска решения я найти не могу потому и прошу подтолкнуть меня на верный путь...

(11 Янв, 15:51) Lezenford

Задача в принципе простейшая. А с шуффл, так вообще...

(11 Янв, 15:49) Haart

Я же не просто так вам дал тестовую строку, что-бы поиздеваться...

alt text alt text alt text

(11 Янв, 15:48) Haart

Для этой последовательности нет варианта с правильным ответом. моя программа просто будет бесконечно мешать коллекцию, но ответа не найдет. Сделать же полноценную логику - это нужно целое древо вариантов разворачивать, как ИИ для шахмат... не уверен что эта задача ставила перед собой такой вариант... Что предлагаете?

(11 Янв, 15:22) Lezenford

Тестируйте

Риев Нью-Йорк Амстердам Вена Мельбурн Венм Колв арк кра рор зор вызов роза мар вуз
(11 Янв, 15:18) Haart
Ваш ответ
включить просмотр

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×84

Задан: 11 Янв, 13:37

Просмотров: 58 раз

Отредактирован: 12 Янв, 01:39