Добро пожаловать

Ресурс, посвященный проекту JavaRush.

ПО всем вопросам можно писать на support{собака}javarush.ru.

Обсуждение задач
UPD: Вся активность этого блога переехала на help.javarush.ru. Все вопросы по задачам задавайте там.
Перед тем, как создавать топик или комментарий, прочитайте это.

Обсуждение лекций — тут находятся топики с дополнительной информацией по каждой лекции из курса. Новые топики в этом блоге создавать нельзя. В комментариях к лекциям можно обсуждать сами лекции (и добавлять полезные ссылки по соответствующей теме).

Отзывы — не проходите мимо. Тут вы можете оставить свои отзывы о проекте JavaRush.

Помощь по IntelliJ Idea — тут размещены разнообразные подсказки, видео и ссылки по работе с лучшей IDE для работы с Java.

ЧАВО — самые часто задаваемые вопросы и ответы на них.

План учебного курса — подробный план по уровням курса JavaRush. Тут вы можете узнать, чему именно вы сможете обучиться, какие навыки приобрести.

Инструкции по работе с JavaRush — тут вы узнаете, как правильно пользоваться обучающим курсом, как эффективнее учиться, как правильно задавать вопросы или искать самим на них ответы…

P.S. Еще создана тема для формирования вопросов для Faq по проекту. Присоединяйтесь к формированию вопросов.
  • ,

Новогодняя Акция на JavaRush!

Друзья! Спешим поделиться радостной новостью: с 8 по 22 декабря вы можете приобрести годовую подписку на JavaRush за полцены.

Подробности на сайте — javarush.ru/s/sale-info

Акция на JavaRush
Поторопитесь! 22 декабря цены снова станут обычными.

P.S.: Лучшие студенты получат дополнительную персональную скидку.
  • ,

Сделаешь всё по пунктам, всё работает. Валидатору не нравится.

Всё перепроверишь, и паника. Хорошо если удаётся нагуглить чьё-то решение, и заменить своё, тоже верное, но не по вкусу валидатору которое. А если нет, то клинит напрочь.
  • ,

task2707 - Определяем порядок захвата монитора

Реализуй логику метода isNormalLockOrder, который должен определять:
соответствует ли порядок synchronized блоков в методе someMethodWithSynchronizedBlocks — порядку передаваемых в него аргументов.
В случае, если сначала происходит синхронизация по o1, а потом по o2, метод должен вернуть true.
Если наоборот — false.

Требования:
1. Метод isNormalLockOrder должен возвращать true в случае, если синхронизация в методе someMethodWithSynchronizedBlocks происходит сначала по объекту o1, а потом по o2.
2. Метод isNormalLockOrder должен возвращать false в случае, если синхронизация в методе someMethodWithSynchronizedBlocks происходит сначала по объекту o2, а потом по o1.
3. Метод isNormalLockOrder НЕ должен быть приватным.
4. Класс Solution НЕ должен быть объявлен с модификатором final.

public class Solution {
    public void someMethodWithSynchronizedBlocks(Object obj1, Object obj2) {
        synchronized (obj2) {
            synchronized (obj1) {
                System.out.println(obj1 + " " + obj2);
            }
        }
    }

    public static boolean isNormalLockOrder(final Solution solution, final Object o1, final Object o2) throws Exception {

        Thread thread1 = new Thread(){
            @Override
            public void run() {
                solution.someMethodWithSynchronizedBlocks(o1,o2);
            }
        };
        synchronized (o1) {
            thread1.start();
            while (true) {
                Thread.State ts = thread1.getState();
                if (ts == Thread.State.BLOCKED) {
                    System.out.println(thread1.holdsLock(o2));
                    break;
                }
            }
        }
        return false;
    }

    public static void main(String[] args) throws Exception {
        final Solution solution = new Solution();
        final Object o1 = new Object();
        final Object o2 = new Object();

        System.out.println(isNormalLockOrder(solution, o1, o2));
    }
}


Почему thread1.holdsLock(o2) — при любом раскладе, выдает false ???
и как получить .holdsLock(o2) держателя мютекса у объекта о2 ???

level36.lesson10.task01

Выдает null. Помогите понять, что не так.

package com.javarush.test.level36.lesson10.task01;

import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

/* Найти класс по описанию
1. Реализует интерфейс Queue
2. Используется при работе с трэдами
3. Из этой очереди элементы могут быть взяты только тогда, когда они заэкспарятся, их время задержки истекло
4. Головой очереди является элемент, который заэкспарился раньше всех
*/
public class Solution {
    public static void main(final String[] args) {
        System.out.println(getExpectedClass());
    }
    final String packageName = Queue.class.getPackage().getName().replaceAll("\\.", "/");
    public static Class getExpectedClass() {
        final Set<Class> classes = new HashSet<>();
        final String packageName = Queue.class.getPackage().getName().replaceAll("\\.", "/");

        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
        final URL enn = cl.getResource(packageName + "/Queue.class");
        final String jarFilePath = enn.toString().split("file:/")[1].split("!/" + packageName)[0];

        try {
            final JarFile jarFile = new JarFile(jarFilePath);
            final List<? extends JarEntry> jarEntryList = Collections.list(jarFile.entries());

            for (final JarEntry jarEntry : jarEntryList) {
                if (jarEntry.isDirectory()) continue;
                final String fileName = jarEntry.getName();
                if (fileName.startsWith(packageName + "/concurrent") && fileName.endsWith(".class") && !fileName.contains("$")) {
                    final String classPath = fileName.substring(0, fileName.length() - 6).replaceAll("[\\|/]", ".");
                    classes.add(Class.forName(classPath));
                }
            }
        } catch (final IOException | ClassNotFoundException ignored) {
        }

        for (final Class cls : classes) {
            if (Queue.class.isAssignableFrom(cls) && cls.getEnclosingClass() == null && !cls.isInterface()) {
                final Method[] methods = cls.getDeclaredMethods();
                for (final Method m : methods) {
                    if (m.getName().toLowerCase().contains("expired")) {
                        return cls;
                    }
                }
            }
        }
        return null;
    }
}


Выбрасывается исключение на строчке
final JarFile jarFile = new JarFile(jarFilePath);


Я уж от отчаяния попробовал через ZipFile, но один чёрт :).
  • ,

task1630

Компилируется, читает оба файла и выводит в консоль 2 строки с содержимым файлов как и требуется заданием, но валидацию не проходит…

(Метод run класса ReadFileThread должен считывать строки из файла, установленного методом setFileName. А метод getFileContent, этого же класса, должен возвращать вычитанный контент. Возвращаемое значение — это одна строка, состоящая из строк файла, разделенных пробелами. — Содержимое файла должен вычитывать метод run.)

package com.javarush.task.task16.task1630;

import java.io.*;

public class Solution {
    public static String firstFileName;
    public static String secondFileName;

    //add your code here - добавьте код тут
    static {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            firstFileName = reader.readLine();
            secondFileName = reader.readLine();
        } catch (IOException e) { }
    }

    public static void main(String[] args) throws InterruptedException {
        systemOutPrintln(firstFileName);
        systemOutPrintln(secondFileName);
    }

    public static void systemOutPrintln(String fileName) throws InterruptedException {
        ReadFileInterface f = new ReadFileThread();
        f.setFileName(fileName);
        f.start();
        //add your code here - добавьте код тут
        f.join();
        System.out.println(f.getFileContent());
    }

    public interface ReadFileInterface {

        void setFileName(String fullFileName);

        String getFileContent();

        void join() throws InterruptedException;

        void start();
    }

    //add your code here - добавьте код тут
    public static class ReadFileThread extends Thread implements ReadFileInterface {
        private String filename;
        private String filetxt;

        public void run(){
            File f = new File(filename);
            String line;
            try {
                BufferedReader filereader = new BufferedReader(new FileReader(f));
                while ((line = filereader.readLine()) != null){
                    if (filetxt == null) {
                        filetxt = line;
                    } else
                        filetxt += " "+line;
                }
                filereader.close();

            } catch (IOException e) {
                System.out.println("Error!");
            }
        }

        @Override
        public void setFileName(String fullFileName) {
            filename = fullFileName;
        }

        @Override
        public String getFileContent() {
            return filetxt;
        }
    }
}
  • ,

Не могу понять куда копать!

import java.io.*;
import java.util.ArrayList;

public class remove {
    public static void main(String[] args) {
        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in))) {
            String file = "D:\\text.txt";// bufferedReader.readLine();
            bufferedReader.close();
            ArrayList<String> list = new ArrayList<>();
            try (BufferedReader fileReader = new BufferedReader(new FileReader(file))) {
                while (fileReader.ready()) {
                    String line = fileReader.readLine();
                    if (!line.contains("параметр=") && line.contains("параметр")) {
                        String arg[] = line.split("=");
                        list.add(arg[0] + "=");
                    } else  //if(line.contains("параметр1=")||line.contains("параметр2=" )||line.contains("параметр3=" ))
                    {
                        list.add(line);
                    }
                }
            }
            try (BufferedWriter fileWriter = new BufferedWriter(new FileWriter(file))) {
                for (String s : list) {
                    fileWriter.write(s);
                    fileWriter.newLine();
                }
            }
        } catch (IOException e) {
            System.out.println("Что-то с именем файла");
        }

    }
}


файл с тестом
параметр=kn;ljlфывфывфывфы
параметр1=ываываыва
параметр3=фвфывфывфыв
параметр4=ываываываыва
параметр=1ываываыа

При запуски идеи все хорошо выдает:

параметр=kn;ljlфывфывфывфы
параметр1=
параметр3=
параметр4=
параметр=1ываываыа

А вот если сохранить в .jar формат выдает:
параметр=
параметр1=
параметр3=
параметр4=
параметр=

Вопрос, что делаю не так.
P/S это не по задачам javarush, просто хотела написать небольшую утилиту себе в помощь по работе, но вот бяда мои знания пока не достаточно широки чтобы реализовать jar фотмат в номальной кодировки. Как я понимаю дело в кодировке if(line.contains(«параметр=»)) list.add(line); потму как вот сюда не заходит. Сам файл сохранен в блокноте с кодировкой utf-8.
  • ,

Уровень 32. Вопросы.

Уровень 32
3 лекция: StringReader, StringWriter

Код в лекции для примера «Чтение из объекта reader и запись в объект writer»
Выдает ошибку:
Exception in thread "main" java.lang.NullPointerException
	at java.lang.StringBuilder.<init>(StringBuilder.java:112)


По всей видимости это происходит при 4-й итерации цикла, когда считывать из br собственно уже нечего и считывается null, который при попытке записи в StringBuilder и вызывает ошибку.

В чём тут дело, почему пример не работает как надо?

public static void main (String[] args) throws Exception
{
 //эту строку должен будет прочитать Reader
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 //заворачиваем строку в StringReader
 StringReader reader = new StringReader(test);

 //Создаем объект StringWriter
 StringWriter writer = new StringWriter();

 //переписываем строки из Reader во Writer, предварительно развернув их
 executor(reader, writer);

 //получаем текст, который был записан во Writer
 String result = writer.toString();

 //выводем полученный из Writer’а текст на экран
 System.out.println("Результат: "+result);
}

public static void executor(Reader reader, Writer writer) throws Exception
{
 BufferedReader br = new BufferedReader(reader);
 while (br.ready())
 {
  //читаем строку из Reader’а
  String line = br.readLine();

  //разворачиваем строку задом наперед
  StringBuilder sb = new StringBuilder(line);
  String newLine = sb.reverse().toString();

  //пишем строку в Writer
  writer.write(newLine);
 }
}
  • ,

коварный валидатор не пропускает задачу "Проход по дереву файлов" task31.task3101

вот условие задачи:

1. На вход метода main подаются два параметра.

Первый — path — путь к директории, второй — resultFileAbsolutePath — имя существующего файла, который будет содержать результат.

2. Для каждого файла в директории path и в ее всех вложенных поддиректориях выполнить следующее:

2.1. Если у файла длина в байтах больше 50, то удалить его (используй метод FileUtils.deleteFile).

2.2. Если у файла длина в байтах НЕ больше 50, то для всех таких файлов:

2.2.1. Отсортировать их по имени файла в возрастающем порядке, путь не учитывать при сортировке.

2.2.2. Переименовать resultFileAbsolutePath в ‘allFilesContent.txt‘ (используй метод FileUtils.renameFile).

2.2.3. В allFilesContent.txt последовательно записать содержимое всех файлов из п. 2.2.1. После каждого тела файла записать "\n".

Все файлы имеют расширение txt.

Требования:

1. Файл, который приходит вторым параметром в main, должен быть переименован в allFilesContent.txt.

2. Нужно создать поток для записи в переименованный файл.

3. Пройдись по всем файлам в директории, которая приходит первым параметром в main, и всех ее поддиректориях. Файлы с размером более 50 байт нужно удалить используя метод FileUtils.deleteFile.

4. Содержимое всех файлов, размер которых не превышает 50 байт, должно быть записано в файл allFilesContent.txt в отсортированном по имени файла порядке.

5. Поток для записи в файл нужно закрыть.

вот мое решение:

package com.javarush.task.task31.task3101;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/*
Проход по дереву файлов
*/
public class Solution {
    public static List<File> smallFiles = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        File path = new File(args[0]);
        File resultFileAbsolutePath = new File(args[1]);
        File newFile;
        if(resultFileAbsolutePath.getParent()==null){
            newFile = new File("allFilesContent.txt");
        }else newFile = new File(resultFileAbsolutePath.getParent() + "\\allFilesContent.txt");

        FileUtils.renameFile(resultFileAbsolutePath, newFile);

        FileOutputStream fileOutputStream = new FileOutputStream(newFile);

        checkDir(path);

        Collections.sort(smallFiles, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });

        for(File files:smallFiles){
            FileInputStream fileInputStream = new FileInputStream(files);
            while (fileInputStream.available() > 0){
                fileOutputStream.write(fileInputStream.read());
            }
            fileOutputStream.write('\n');
            fileOutputStream.flush();
            fileInputStream.close();
        }

        fileOutputStream.close();
    }

    public static void checkDir(File file){
        for(File fileList:file.listFiles()){
            if(fileList.isDirectory())checkDir(fileList);
            if(fileList.isFile()){

                if(fileList.length() > 50){
                    FileUtils.deleteFile(fileList);
                }else {
                    smallFiles.add(fileList);
                }
            }
        }
    }

    public static void deleteFile(File file) {
        if (!file.delete()) System.out.println("Can not delete file with name " + file.getName());
    }
}


валидатору все нравится, кроме пункта: «Поток для записи в файл нужно закрыть.» почему он так считает я не понимаю!
вдобавок, уже меня смущает тот факт, что, в моем случае, содержимое всех файлов записывается в одну строку, хотя после записи каждого тела файла я вставляю строку

fileOutputStream.write('\n');


кто может объяснить, где я ошибаюсь?

level31.lesson02.home02

/* Находим все файлы
Реализовать логику метода getFileTree, который должен в директории root найти список всех файлов включая вложенные.
Используйте очередь, рекурсию не используйте.
Верните список всех путей к найденным файлам, путь к директориям возвращать не надо.
Путь должен быть абсолютный.
*/

package com.javarush.test.level31.lesson02.home02;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Solution
{

    public static void main(String[] args) throws IOException
    {
        List<String> list = getFileTree("C:\\Users\\1\\Downloads\\JavaRushHomeWork\\JavaRushHomeWork\\test");
        for (int i = 0; i < list.size(); i++)
        {
            System.out.println(list.get(i));
        }
    }

    public static List<String> getFileTree(String root) throws IOException
    {
        List<File> allDir = new LinkedList<>();
        List<String> allFiles = new ArrayList<>();
        File file = new File(root);

        for (File entry : file.listFiles()
                )
        {
            if (entry.isFile()) allFiles.add(entry.getAbsolutePath());
            else allDir.add(entry);
        }

        while (!allDir.isEmpty())
        {
            for (File folder : allDir
                    )
            {
                for (File search : folder.listFiles()
                        )
                {
                    if (search.isFile()) allFiles.add(search.getAbsolutePath());
                    else allDir.add(search);
                }
            }
            allDir.remove(0);
        }
        return allFiles;
    }
}


Вывод:
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\1.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\3.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\6.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\7.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\123\12333.txt

Перед отправкой на сервер main удаляю. Не принимается. Подскажите, что не так?

level22.lesson09.task03 - ни в какую не принимается!!!

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

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;


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

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

Результат:
Амстердам Мельбурн Нью-Йорк Киев Вена
*/
public class Solution {
    public static void main(String[] args) throws Exception {

        BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        String fileName = consoleReader.readLine();
        consoleReader.close();

        BufferedReader fileReader = new BufferedReader(new FileReader(fileName));
        String[] words = fileReader.readLine().split(" ");
        fileReader.close();

        StringBuilder result = getLine(words);
        System.out.println(result.toString());
    }

    public static StringBuilder getLine(String... words) {
        if (words == null || words.length == 0) return null;
        StringBuilder sb = new StringBuilder();
        for (String s : words) {
            if (!sb.toString().contains(s)) {
                if (sb.toString().isEmpty()) {
                    sb.append(s + " ");
                } else {
                    String sbFirstChar = sb.toString().trim().substring(0, 1);
                    String sbLastChar = sb.toString().trim().substring(sb.toString().trim().length() - 1);
                    String wordFirstChar = s.substring(0, 1);
                    String wordLastChar = s.substring(s.length() - 1);

                    if (sbFirstChar.equalsIgnoreCase(wordLastChar)) {
                        sb.insert(0, s + " ");
                    } else if (sbLastChar.equalsIgnoreCase(wordFirstChar)) {
                        sb.append(s + " ");
                    }
                }
            }
        }
        return sb;
    }
}


Что я упустил??? Проверки сделал, все равно чего-то не хватает компилятору
  • ,

Общение с иностранцами в качестве тренировки английского

Здравствуйте. Вроде где-то тут кто-то когда-то писал, что есть какие-то нормальные ресурсы, где можно пообщаться с иностранцами. Никто не знает таких ресурсов? Хочется потренироваться в английском. Мне кажется, это реальная вещь.