Смотритель: hubert

task19.task1921 не принимает валидатор

Всем привет! Подскажите, почему валидадор не хочет принимать задачу? Локально все работает так, как и должно. Однако валидатор так не считает. Ругается на «Программа должна правильно работать с двойными именами, например Анна-Надежда.»

Собственно код

package com.javarush.task.task19.task1921;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

/* 
Хуан Хуанович
*/

public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args) throws ParseException {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(args[0]));
            SimpleDateFormat sdf = new SimpleDateFormat("dd mm YYYY", Locale.ENGLISH);
            String buffer;

            try {
                while ((buffer = reader.readLine()) != null) {
                    String name = "";
                    String bDay = "";
                    String[] temp = buffer.split(" ");
                    for (int i = 0; i < temp.length; i++) {
                        if (checkNumber(temp[i])) bDay += temp[i] + " ";
                        else name += temp[i] + " ";
                    }
                    Date date = sdf.parse(bDay.substring(0, bDay.length() - 1));

                    PEOPLE.add(new Person(name, date));
                }
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

    public static boolean checkNumber(String n) {
        try {
            Integer.parseInt(n);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
}

В консоль выводит это, т.е. имена с "-" обрабатываются более чем нормально и корректно

Petrov Sun Dec 28 00:12:00 MSK 1986
Sidorov Sun Dec 28 00:12:00 MSK 1986
Ivanov Sun Dec 28 00:12:00 MSK 1986
Petrov-Sidorov Popov Sun Dec 31 00:12:00 MSK 1989

Где и что я упускаю?

Встрял на втором задании Archiver(2) task.task31.task3110

Всем привет.

Уже второй раз так горит. Все работает. Все нормально. Но вот эти тонкости х**** валидатора.

Подскажите, в чем тут проблема?

Требования:
1. Метод createZip должен создавать ZipOutputStream используя поле zipFile и метод Files.newOutputStream.
2. Метод createZip должен создавать элемент архива ZipEntry c именем файла, полученным из параметра source.
3. Созданный ZipEntry нужно добавить в ZipOutputStream.
4. Для переменной source должен быть создан InputStream с помощью метода Files.newInputStream.
5. Данные из InputStream нужно переписать в ZipOutputStream.
6. Закрой текущий Entry у объекта ZipOutputStream.
7. InputStream для source должен быть закрыт.
8. ZipOutputStream должен быть закрыт.


package com.javarush.task.task31.task3110;

import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFileManager {
    private Path zipFile;

    public ZipFileManager(Path zipFile) {
        this.zipFile = zipFile;
    }

    public void createZip(Path source) throws Exception {
        try(ZipOutputStream zipOutputStream = new ZipOutputStream(Files.newOutputStream(zipFile.getFileName()))) {
            ZipEntry zipEntry = new ZipEntry(source.getFileName().toString());
            zipOutputStream.putNextEntry(zipEntry);

            try(InputStream inputStream = Files.newInputStream(source.getFileName())) {
                while (inputStream.available() > 0) {
                    zipOutputStream.write(inputStream.read());
                }
            }
            zipOutputStream.closeEntry();
        }
    }
}


Второй класс не выкладываю, тк.., ругается не на него.

Заранее спасибо.
  • ,

Задача змейка и невозможность написать свою змейку с 0. В чем моя проблема?

Добрый день.
У меня такое может быть странное обращение, но мне хотелось бы понять где истина)
Заранее простите за возможный сумбур, не берите ничего на личный счет.

Я дошел до 25 уровня.
И только сейчас решил вам написать насчет задачи «Змейка».
разрешите немного пояснить.

Я дошел до 14-ой части, на 14-ой части надо было реализовать метода принт.

Я долго мучался сам, но ничего не смог решить на 14 части. Сидел примерно дня 3-4. Потом мне пришлось начать искать помощи в гугле, я облазил много страничек, но в конце концов мне пришлось просто скопировать чужое решение этой части. Причем я больше времени потратил на копипаст этого решения, потому что подошло только одно из всего множества. (Для меня до сих пор загадка, почему оно подошло, а мое нет)
После 14-ой части было легче.

Я прошел этот уровень, смог идти дальше. Но знаний после этой задачи у меня не осталось.
Я решил закрепить эту задачу написав ее сам, знаете какой результат? Я не смог, потому что я просто не понял как решить 14-ую часть)) К тому же по ходу задачи «Змейка» добавляются автоматически строки кода, и написано(разобраться в них) — я разобрался, но еще раз написать тоже самое не смог.

Я хочу спросить, в чем моя ошибка? Где слабая сторона? Как мне стать лучше? По какой причине у меня не осталось знаний после этой задачи?

String matches и contains не работают регулярные выражения

Здраствуйте
Я не могу понять, почему класс String его методы contains и matches не работают у меня с регулярными выражениями. При этом у других данный код работает. у меня java 8. Может быть такое, что в новой версии данные методы были отменены? или я все таки не правильно что то делаю.

P.S. данную задачу другими методами я могу решить. Я протестировал именно эти методы и они выдали такой
странный результат.

package com.javarush.task.task22.task2212;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
Проверка номера телефона
*/
public class Solution {
    public static boolean checkTelNumber(String telNumber)

    {
        System.out.println(telNumber);
        if(telNumber == null) return false;
        Pattern pattern = Pattern.compile("[a-z]+");
        Matcher matcher = pattern.matcher(telNumber); // так работает
        System.out.println("has symbol: " + matcher.find());
        System.out.println("contains: "+telNumber.contains("\\w"));

        System.out.println("matches: " + telNumber.matches("\\w"));
        System.out.println("contains: " + telNumber.contains("[a-z]"));

        return true;
    }

    public static void main(String[] args) {
        System.out.println(checkTelNumber("sd"));    }
}


вывод данного кода

sd
has symbol: true
contains: false
matches: false
contains: false
true

String matches и contains не работают регулярные выражения

Здраствуйте
Я не могу понять, почему класс String его методы contains и matches не работают у меня с регулярными выражениями. При этом у других данный код работает. у меня java 8. Может быть такое, что в новой версии данные методы были отменены? или я все таки не правильно что то делаю.

P.S. данную задачу другими методами я могу решить. Я протестировал именно эти методы и они выдали такой
странный результат.

package com.javarush.task.task22.task2212;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
Проверка номера телефона
*/
public class Solution {
    public static boolean checkTelNumber(String telNumber)

    {
        System.out.println(telNumber);
        if(telNumber == null) return false;
        Pattern pattern = Pattern.compile("[a-z]+");
        Matcher matcher = pattern.matcher(telNumber); // так работает
        System.out.println("has symbol: " + matcher.find());
        System.out.println("contains: "+telNumber.contains("\\w"));

        System.out.println("matches: " + telNumber.matches("\\w"));
        System.out.println("contains: " + telNumber.contains("[a-z]"));

        return true;
    }

    public static void main(String[] args) {
        System.out.println(checkTelNumber("sd"));    }
}


вывод данного кода

sd
has symbol: true
contains: false
matches: false
contains: false
true
  • ,

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

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

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.
  • ,

коварный валидатор не пропускает задачу "Проход по дереву файлов" 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 удаляю. Не принимается. Подскажите, что не так?