21

Re: Мій перший репозиторій на GitHub

реалізації записують себе до файлів по різному, хоча обоє використовують FileChannel з CharBuffer
тобто вони використовують різні алгоритми

другий варіант запропонований тобою не надто відрізняється від мого крім назви інтерфейсу і його методів (хоча TrieIO, мабуть, не надто вдала назва),
проблема цього підходу у тому, що нам потрібно мати екземпляр Trie, щоб здійснити десеріалізацію

22

Re: Мій перший репозиторій на GitHub

Regen написав:

реалізації записують себе до файлів по різному, хоча обоє використовують FileChannel з CharBuffer
тобто вони використовують різні алгоритми

другий варіант запропонований тобою не надто відрізняється від мого крім назви інтерфейсу і його методів (хоча TrieIO, мабуть, не надто вдала назва),
проблема цього підходу у тому, що нам потрібно мати екземпляр Trie, щоб здійснити десеріалізацію

ном, теж потім звернув увагу що майже скопіював твій варіант :)
ось ще 1 з варіантів. я б мабуть собі б його залишив.

interface Trie {
    void add(String s);
}

class ArrayTrie implements Trie {
    @Override
    public void add(String s) {}
}

class FileArrayTrieSupplier implements Supplier<Trie> {
    private final File file;

    public FileArrayTrieSupplier(File file) {
        this.file = file;
    }

    @Override
    public Trie get() {
        // load from file
        return new ArrayTrie();
    }
}

class URLArrayTrieSupplier implements Supplier<Trie> {
    private final URL address;

    public URLArrayTrieSupplier(URL address) {
        this.address = address;
    }

    @Override
    public Trie get() {
        // load over internet
        return new ArrayTrie();
    }
}
// ...

Supplier<Trie> trieSupplier = new FileArrayTrieSupplier(new File("myfile.txt"));
Trie arrayTrieFromFile = trieSupplier.get();

trieSupplier = new URLArrayTrieSupplier(new URL("http://0.0.0.0/txt"));
Trie arrayTrieFromURL = trieSupplier.get();

Якщо треба статичні:

final class TrieIO {
    public static Trie readFromFile(String str) throws IOException {
        final File file = new File(str);
        String fileContent = new String(Files.readAllBytes(Paths.get(file.toURI())), "UTF-8");
        
        if (magicMethodToDetectIfInFileIsArrayTri(fileContent)) {
            return new FileArrayTrieSupplier(file).get();
        } else if (magicMethodToDetectIfInFileIsLinkedTri(fileContent)) {
            return new FileLinkedTrieSupplier(file).get();
        }
        //..
    }
    // ..
}

Trie trieFromFile = TrieIO.readFromFile("myfile.txt");
Подякували: Regen1

23

Re: Мій перший репозиторій на GitHub

Прихований текст

писатиму зараз як критик тобто як особа, що сама ніц зробити не може, а тільки бачить недоліки у ідеях інших тому наперед прошу вибачення

другий варіант зовсім не до душі, бо він не може бути розширюватим
як в такому випадку юзер зможе здійснювати серіалізацію/десеріалізацію власної реалізації Trie? хіба що копаючись у коді TrieIO і додаючи власні if

щодо першого то доганяю, що це strategy (і використати її я не здогадався), але тут трабл у тому, що:
я або мушу додавати методи save/load до реалізацій і вписувати в них

Supplier<Trie> trieSupplier = new FileArrayTrieSupplier(new File("myfile.txt"));
Trie arrayTrieFromFile = trieSupplier.get();

або змушувати робити це користувача

велике дякую за ідеї, зараз думаю над можливістю створювати неініціалізовані екземпляри з можливістю ініціалізувати їх безпосередньо в loadTrie методі

24

Re: Мій перший репозиторій на GitHub

Regen написав:
Прихований текст

писатиму зараз як критик тобто як особа, що сама ніц зробити не може, а тільки бачить недоліки у ідеях інших тому наперед прошу вибачення

другий варіант зовсім не до душі, бо він не може бути розширюватим
як в такому випадку юзер зможе здійснювати серіалізацію/десеріалізацію власної реалізації Trie? хіба що копаючись у коді TrieIO і додаючи власні if

щодо першого то доганяю, що це strategy (і використати її я не здогадався), але тут трабл у тому, що:
я або мушу додавати методи save/load до реалізацій і вписувати в них

Supplier<Trie> trieSupplier = new FileArrayTrieSupplier(new File("myfile.txt"));
Trie arrayTrieFromFile = trieSupplier.get();

або змушувати робити це користувача

велике дякую за ідеї, зараз думаю над можливістю створювати неініціалізовані екземпляри з можливістю ініціалізувати їх безпосередньо в loadTrie методі

Другий варіант виключно щоб тобі повернути статичні методи. Ніяк ти не зробиш окрім як просто вписувати в кожен клас статичний метод.
Щодо " додавати методи save/load до реалізацій і вписувати в них" а нащо це робити? Нехай твої реалізації будуть просто стуртурой даних, а не швейцарським ножем. Дай собі відповідь, скільки користувачів будуть активно записувати й читати Trie з файлів?

Подякували: Regen1

25 Востаннє редагувалося Regen (02.02.2016 12:36:52)

Re: Мій перший репозиторій на GitHub

хм, в принципі неініціалізовані екземпляри виглядатимуть потворно і потрібно буде дбати за безпеку методів add, contains + вони вносять дяйкий missanderstanding для юзерів

треба буде юзати starategy, як ти і казав
дякую за допомогу і за твій час

26

Re: Мій перший репозиторій на GitHub

Regen написав:

хм, в принципі неініціалізовані екземпляри виглядатимуть потворно і потрібно буде дбати за безпеку методів add, contains + вони вносять дяйкий missanderstanding для юзерів

Це ти взагалі про що? Де "неініціалізовані екземпляри"?

27

Re: Мій перший репозиторій на GitHub

iovchynnikov написав:

Це ти взагалі про що? Де "неініціалізовані екземпляри"?

я писав ось таке
"зараз думаю над можливістю створювати неініціалізовані екземпляри з можливістю ініціалізувати їх безпосередньо в loadTrie методі"
але твій 1 варіант кращий, хоча юзерам треба буде писати 2 лінійки коду

28

Re: Мій перший репозиторій на GitHub

Regen написав:
iovchynnikov написав:

Це ти взагалі про що? Де "неініціалізовані екземпляри"?

я писав ось таке
"зараз думаю над можливістю створювати неініціалізовані екземпляри з можливістю ініціалізувати їх безпосередньо в loadTrie методі"
але твій 1 варіант кращий, хоча юзерам треба буде писати 2 лінійки коду

тобто

Trie t = new ArraTrie();
t.loadFromFile("file.xml")?

так?

29 Востаннє редагувалося Regen (02.02.2016 13:07:06)

Re: Мій перший репозиторій на GitHub

так, щось вроді того, але воно якесь потворне
неініціалізований значить всі поля null

можна було б додати ось такий конструктор

public ArrayTrie(boolean noninitialized) {
//empty body
}

30

Re: Мій перший репозиторій на GitHub

Regen написав:

так, щось вроді того, але воно якесь потворне
неініціалізований значить всі поля null

А чому твій конструктор створює об'єкт у сирому стані?
чому new ArrayList<>() це готовий об'єкт для роботи, а твій new ArrayTrie<>() - "неініціалізований"?

Якщо вже так хочеш то зроби звичайний конструктор без аргументів, без ідеї в голові що "цей конструктор для того, щоб хтось потім використав loadFromFile()". Тоді все ок буде.

PS: Дякую за тлумачення слова неініціалізований :)

Regen написав:

можна було б додати ось такий конструктор

public ArrayTrie(boolean noninitialized) {
//empty body
}

прибери це щоб мої очі не бачили  :o

Подякували: Regen, leofun012

31 Востаннє редагувалося Regen (02.02.2016 17:53:46)

Re: Мій перший репозиторій на GitHub

Вирішив "потестувати" запис масиву char розміром 1,000,000 використовуючи nio і ObjectOutputStream

Прихований текст

лєнь було перекладати тому на англ

 

the results is next for 1,000,000 chars
nio - 14.91 ms;
ObjectOutputStream - 75.23 ms (in 5 times bigger!)

but when I've increased size of array to 10,000,000 the results was next
nio - 162.46 ms;
ObjectOutputStream - 243.62 ms

коротше кажучи робитиму все через Externalizable

висновок premature optimization is root of all evil
P.S. ще один висновок- спочатку треба пробувати всі варіанти і тільки тоді писати питання і марнувати чийсь час

Подякували: leofun011

32

Re: Мій перший репозиторій на GitHub

Можеш ще спробувати для серіалізації https://github.com/EsotericSoftware/kryo

Подякували: Regen, leofun012

33

Re: Мій перший репозиторій на GitHub

iovchynnikov написав:

Можеш ще спробувати для серіалізації https://github.com/EsotericSoftware/kryo

дякую, коли матиму час спробую

34 Востаннє редагувалося Regen (03.02.2016 22:02:44)

Re: Мій перший репозиторій на GitHub

Regen шле усім вітання!

Додав версію 2.1.0, основні зміни

  • реалізував Externalizable для ArrayTrie і LinkedTrie

  • додав два пакети array і linked до пакету trie, в ці пакети впихнув відповідні їм класи

35

Re: Мій перший репозиторій на GitHub

Ось це interace с ходу вже просить цегли :))
Плюс є деякі нюанси: наприклад, традиційно в сорс-адресах немає каталогу "гітхаб", тести зазвичай не заливаються, це твоя задача - тестувати, по замовчуванню твоя збірка вже має працювати.
А код треба вичитувати.

36

Re: Мій перший репозиторій на GitHub

fedinmozok написав:

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

Ват? Ви Пане де таке вичитали?
За Вашою логікою ви щойно викрили, що 99% програмістів - бидлокодери, що сміття комітують.

Цілий ось Apache Foundation тільки негідників:
https://github.com/apache/spark/tree/ma … e/src/test
....

Подякували: Regen, leofun012

37

Re: Мій перший репозиторій на GitHub

Тести заливаються. https://github.com/JetBrains/intellij-community/ ще й як заливаються. І те що ви викидуєте у репозиторії не обовязково має працювати стабільно. Стабільно мають працювати білди які ви розміщуєте де хочете. Можна робити релізи на  github. Гілка masterбажано має бути стабільною але не завжди у всіх так виходить. Тому всі дивляться на білди (релізи, теги)

Подякували: Regen, leofun012

38

Re: Мій перший репозиторій на GitHub

Давно я тут не писав, за цей час здійснив кілька комітів

Version 2.2.2

Changes in project:

SubtrieConverter interface were introduced
algorithms of converting Trie realizations to serializable form(converting Trie to array of chars)were placed in appropriate Node`s classes in purpose of making Trie realizations more lightweight

Version 2.2.1

Builder of ArrayDAWG and Builder of LikedDAWG were removed

Version 2.2.0

Were introduced changes in project, such as:

interface Alphabet was added
was added enum CommonAlphabets that holds instances for english, ukrainian and russian Alphabet`s
method isPrefix() was added to interface WordGraph

Подумую над швидкою серіалізацією, тут 2 варіанти

  • kryo, запропонована раніше паном iovchynnikov

  • fst

тут http://stackoverflow.com/questions/1401 … erformance можна почитати детальніше

39

Re: Мій перший репозиторій на GitHub

fedinmozok написав:

Ось це interace с ходу вже просить цегли :))

лол, що?

fedinmozok написав:

А код треба вичитувати.

справді?

а на рахунок тестів за мене уже відповіли пан iovchynnikov і пан funivan

40

Re: Мій перший репозиторій на GitHub

Regen написав:
fedinmozok написав:

Ось це interace с ходу вже просить цегли :))

лол, що?

fedinmozok написав:

А код треба вичитувати.

справді?

а на рахунок тестів за мене уже відповіли пан iovchynnikov і пан funivan

Не переймайтеся так. То якийсь висер був :)

Подякували: Regen1