• Как сделать класс для работы с JSON, который может содержать в себе объекты разных типов?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    С ретрофитом вы наверняка используете какую-нибудь ConverterFactory для преобразования ответа в объект. Например, GsonConverterFactory (GSON). Рассмотрим ситуацию на его примере:
    Все объекты описываете как обычно, кроме msg. Его описываете как интерфейс Message. Регистрируете:
    class MessageDeserializer implements JsonDeserializer<Message>{ ... }
    ...
    Gson gson = new GsonBuilder()
                    .registerTypeAdapter(Message.class, new MessageDeserializer())
                    .create();
    GsonConverterFactory.create(gson);

    В методе
    public Message deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { ... }

    Десериализуете msg на основе тех данных, которые есть (надо научиться различать разные типы msg). Кладёте данные в разные реализации Message, например для {'txt':''} делаете такую реализацию:
    class MessageTxt implements Message {
        private final String txt;
        public MessageTxt(String txt){
            this.txt = txt;
        }
        String getTxt() { return txt; }
    }

    Сам интерфейс Message может вообще не содержать методов (маркерный интерфейс) или содержать общие для всех типов msg методы, или дополнительно содержать метод для возвращения типа. Как-то так я бы поступил, видимо. Разные реализации Message потом можно просто проверять instaceof и кастовать.
    Ответ написан
    6 комментариев
  • Как провести анализ кривой?

    @idap
    интересуюсь python, latex, linux, ML, AI
    Насколько я понимаю, плохо – это когда разница между минимумом и максимумом очень большая, хорошо – когда эта разница маленькая (по крайней мере на конце графика). Также имеет значение гладкость.

    Я вижу здесь два варианта решения:

    1. Описательный.
    Вы сами формулируете критерии "хорошести", и находите способ её измерения. То есть нужна функция L: "множество функций" -> [0, 1], и если L(f) = 1, то график f хороший, если L(f) = 0, то график f плохой.

    2. Машинное обучение.
    Здесь вам всё равно нужно описать какие-то критерии функции, и для каждой функции соорудить вектор-признак. Например, вектор-признак может содержать информацию (значение максимума; значение минимума; разность между макс и мин; какой-то показатель гладкости (может быть вычислить производную в каждой точке, и смотреть чтобы производная менялась не сильно); площадь подграфика и т.п.).
    Затем, собираете выборку графиков, для них получаете выборку векторов-признаков, и дальше можете использовать алгоритмы классификации: логистическая регрессия, нейронные сети, SVM и т.п. Успех данного подхода зависит от того, насколько хорошо придуманный вами вектор-признак будет описывать ваши же критерии.
    Результатом будет та же функция L: "множество функций" -> [0, 1], только, возможно, вы не сможете осмыслить её работу (не будет словестного критерия, как в п.1), но она также будет выдавать на выход является функция хорошей или плохой.
    Ответ написан
    5 комментариев
  • Как провести анализ кривой?

    Neuroware
    @Neuroware
    Программист в свободное от работы время
    Тут нужно определить критерии "плохой\хороший", потому как по графикам не особо заметно разницы, нужно понимать, что если результат не очевиден человеку, объяснить это компьютеру будет еще тяжелее.
    Если таких критериев нет нужно их найти, что можно следать:
    1. Отобрать как можно больше "плохих" графиков и отдельно "хороших"
    2. Нормализовать, то есть привести их виду, где минимальное и максимальное значение по осям будет одно и тоже (если конечно нет критерия вида много по Y - плохо и т.п.)
    3. На нормализованной плоскости построить сплайн или просто сразу апроксимировать функции таким образом чтобы получить для каждого графика одинаковый набор значений y для одних и тех же X, к примеру на нормализованной плоскости через каждые n единиц по X получить значение Y.
    На выходе получится матрица Xmax*Ymax, где каждой на пересечении будет 1 либо 0
    Данные матрицы можно использовать для обучения нейронной сети.

    или матрицы не строить а оставить в виде последовательности значений Y, потом сравнивать вектора "плохих" графиков с векторами "хороших",
    для сравнения можно будет использовать все что в голову взбредет, то есть любые математические функции, какая ни будь даст достаточно статистически различимый результат. Кстати полученное на п.2-3 можно использовать и для кластеризации.
    Ответ написан
    1 комментарий
  • Как организовать код через ООП для простой задачи?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    На самом деле, написав программу с GUI вы, в большинстве случаев, уже использовали все механизмы ООП, даже если сами не написали ни одного класса. Но, думаю, что вашего преподавателя такой ответ не удовлетворит, поэтому вот несколько вариантов:
    1. Наследовать от базовых графических элементов и создать: класс игрового поля, клетки, содержимого клетки... И куда фантазия заведует. Полиморфным будет метод рисования, как минимум. На мой взгляд вариант плох.
    2. Наследовать от класса кнопки и реализовать соответствующие поведение: флажок там ставить на правый клик и т.д. Ну и при генерации поля кнопки будут просто размещаться в нужном порядке. Тут возможно придётся переопределить метод обработки событий для кнопки ну или что-то похожее сделать...
    3. Есть же у вас класс игры, вот и добавьте класс предка IGame, с виртуальным методом play(). Это быстро и решительно позволит использовать недостающие принципы ООП. Самый короткий, и печальный вариант) Но цель же сдать работу, как я понимаю.
    Ответ написан
    Комментировать
  • Как правильно использовать INotifyPropertyChanged для извещения "родителя" о изменение свойства экземпляра?

    @SZolotov
    Asp.net core, MAUI,WPF,Qt, Avalonia
    К предыдущему ответу я бы еще добавил что в зависимости от задачи можно элементы наследовать от INotifyPropertyChanged. Что бы при изменении элементы коллекции шло уведомление в UI.
    И да, вариант описанный вами не единственный, но вполне имеющий право на жизнь в проекте. Изучайте эту тему дальше.
    Ответ написан
    1 комментарий
  • Как правильно использовать INotifyPropertyChanged для извещения "родителя" о изменение свойства экземпляра?

    @serber
    1. Класс ObservableCollection уже реализует интерфейс INotifyPropertyChanged.
    2. Вы не правильно вызываете метод NotifyPropertyChanged. В качестве параметра должно передаваться имя свойства, которое было изменено. Т.е. должно быть так
    NotifyPropertyChanged("Lenght");
    3. Правильнее писать Length, а не Lenght
    Ответ написан
    1 комментарий
  • Каким образом заставить iPhone не отключаться от wifi сети?

    opium
    @opium
    Просто люблю качественно работать
    Поездив по миру и пожив в разных домах, я понял идеальная система определения человека дома это карта включения света, пришел вставил и включился свет, без карты все выключается кроме розеток, компа, холодильника и на ваше усмотрение, система идеально работает, простая как две копейки, чертовски удобна, никогда не переживаешь что оставил что то включенным дома, тот же утуюг или плитку.
    Все остальное это не для жизни , человеку не нужно слишком много умного, человека радуют простые и понятные ему решения, ну сел у меня телефон и что ваша система рубанет мне свет?
    Ответ написан
    1 комментарий