Страницы

Поиск по вопросам

пятница, 6 марта 2020 г.

json.net Как сериализовать такой объект?

#c_sharp #jsonnet


json.net обычно сериализует словарь в коллекцию:

{"a":{"b":{"c":"d"}}}


Вот так:

class A
{
    public Dictionary a{get; set;}
}

class C
{
    public string c{get; set;}
}

class Program
{
    public static void Main(string[] args)
    {
        A a = new A();
        a.a = new Dictionary();
        C c = new C();
        c.c = "d";
        a.a.Add("b", c);

        string json = JsonConvert.SerializeObject(a);
        Console.WriteLine(json);

        Console.Write("Press any key to continue . . . ");
        Console.ReadKey(true);
    }
}


Но я хочу сериализовать словарь в массив:

{"a":["b":{"c":"d"}]}


Есть ли простой способ сделать это?
    


Ответы

Ответ 1



Ответ на ваш вопрос "Есть ли простой способ сделать это?" - нет. Нет никаких легальных способов сделать это. Все потому что требуемый вами формат невалиден. Вы можете только это сделать вручную, но вопрос уже будет в другом - надо ли вам это? Ведь никакой JSON парсер не сможет распарсить невалидную JSON-строку... P.S проверить валидность JSON-строки можно на https://jsonlint.com/.

Использование вначале переменных при вызове программы

#python #bash


Не знаю переменные ли это или нет, но что это такое и как прочитать их в программе?

$ FOO=1 BAR=2 python3 ./make.py


Что за FOO и BAR?

P.S. Python
    


Ответы

Ответ 1



$ FOO=1 BAR=2 python3 ./make.py такой синтаксис используется в posix-совместимых оболочках для присвоения значений переменным окружения. обратиться к переменным окружения внутри скрипта, написанного на python, можно с помощью os.environ: import os print os.environ['FOO'] print os.environ['BAR']

Ответ 2



Команда python --help выводит usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... попробуйте аргументы добавить после файла python3 ./make.py FOO=1 BAR=2 Посмотрите сам скрипт, там есть парсинг аргументов? Выложите код make.py например сюда можно будет посмотреть есть ли там аргументы и как они названы

Помогите инициализировать TextView

#android #textview #android_textview


Итак, есть layout, содержащий 2 объекта — RecycledView и TextView. RecyclerView работает
через адаптер, который передаёт значение в TextView. Выглядит это так. Фрагмент, содержащий
TextView:

public class FragmentCharts extends Fragment {

//объявляем TextView
TextView chartDetailsHeader;

public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_charts, container, false);

    RecyclerView rationsChart = (RecyclerView) view.findViewById(R.id.rations_chart);
    rationsChart.setHasFixedSize(true);

    LinearLayoutManager rationsChartLayoutManager = new LinearLayoutManager(
            getContext(),
            LinearLayoutManager.HORIZONTAL,
            true);
    rationsChart.setLayoutManager(rationsChartLayoutManager);

    ChartAdapter chartAdapter = new ChartAdapter();
    rationsChart.setAdapter(chartAdapter);

    //инициализируем TextView
    chartDetailsHeader = (TextView) view.findViewById(R.id.chart_details_heading);
    chartDetailsHeader.setTypeface(CommonSettings.getRobotoCondLight());
    return view;
}

//метод для изменения значения TextView
public void setChartHeader(Date date) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM", Locale.US);
    String s = dateFormat.format(date);
    chartDetailsHeader.setText(s);
}
}


Изменение TextView происходит отправкой метода из адаптера:

new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate());


Как я понимаю, при создании new FragmentCharts() должна происходить инициализация
TextView, но в методе setChartHeader() значение TextView почему-то null.

Пытался инициализировать TextView повторно в setChartsHeader(), но где взять view
для инициализации?

В общем, как обычно, нужна помощь.
    


Ответы

Ответ 1



Ваш код new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate()); каждый раз создаёт новый фрагмент. Но так как он ни куда не аттачится и не отображается, соответственно у него не вызываются никакие методы жизненного цикла, в том числе и onCreateView, в котором вы инициализируете TextView. Поэтому он и null. Как решить? Не создавать новый объект фрагмента, а вызывать метод у существующего. То есть, например, добавить в конструктор адаптера параметр FragmentCharts fragment, и обращаться уже к нему. Во фрагменте у вас будет: ChartAdapter chartAdapter = new ChartAdapter(this); А в адапрере: private FragmentCharts fragment; public ChartAdapter(FragmentCharts fragment) { this.fragment = fragment; } ... fragment.setChartHeader(archivesForCharts.get(0).get(0).getDate()); ...

Где можно найти документацию по VK Streaming API?

#vkontakte_api #вконтакте


С лета этого года ВКонтакте ужесточает лимиты на вызов методов newsfeed.search, wall.search
и wall.get и предлагает использовать их новый Streaming API для интерактивного получения
данных по этим методам, но нигде нет информации по использованию этого API. Кто знает
где можно почитать документацию по Streaming API (в разделе для разработчиков у них
пока ничего нет)?

Также интересуют данные по новым лимитам. Пока есть информация по количественному
ограничению вызова метода newsfeed.search (до 100.000 запросов в сутки) с 07.06.2017.
Кто-нибудь знает про другие ограничения?

Судя по новостям, разработчики VK планируют выпустить несколько версий Streaming
API (основную и "расширенную"). Кто знает чем они будут отличаться (сейчас есть только
информация, что "расширенная" версия будет выдавать "100% данных")?

Сама новость в Roadmap:
https://vk.com/dev/data_limits
    


Ответы

Ответ 1



Появилась документация по Streaming API: https://vk.com/dev/streaming_api_docs Но там реально жесть, в базовой версии максимальное количество запросов (правил), по которым поступают данные = 10 штук, в ответе выдается 1% от всей доступной информации (говоря русским языком не выдается практически ничего)). Также сервер должен держать постоянное соединение через WebSockets, которое сервер может произвольно разорвать по прошествии определенного времени (в общем, это весьма неудобно). Из текущего, с 21.06.2017 начинают действовать следующие ограничения по методам newsfeed.search, wall.search и wall.get: метод newsfeed.search можно вызывать не более 25000 раз в сутки; метод wall.search можно вызывать не более 2500 раз в сутки; метод wall.get можно вызывать не более 500000 раз в сутки. Из личной переписки с разработчиками стало ясно, что в итоге сильно урежут суточное количество запросов, будет гораздо ниже вышеуказанных. Пока не ясно, будут ли вводить review (ручную модерацию) приложений по типу instagram, но в свете "борьбы со злоупотреблениями обхода ограничений" мне это видится единственным реальным шагом со стороны разработчиков VK, чтобы эти "злоупотребления" прекратить.

Не могу разобраться ObservableCollection с ListBox

#c_sharp #net #wpf #binding


Проблема скорее всего в привязке. В ListBox не прибавляются элементы.



    
    
        
            
                
                    
                    
                
                
                
                    
                    
                    
                
            
        
    


    
    


Ответы

Ответ 1



Где вы находите такие способы создания коллекций?) Ну, исправим то что есть: Объект создается в ресурсе окна, соответственно добавление элементов в коллекцию должно происходить в конструкторе этого объекта. То что вы добавляете элементы в *.cs файле, это не совсем то, так как это не тот объект к которому вы привязываетесь.(привязка идет к объекту созданному в ресурсе). Идем дальше. Раз уж вы решили создать коллекцию унаследовавшись от нее самой, то добавляйте элементы унаследованным методом: public class MyList : ObservableCollection { public MyList() : base() { Add(new Person("1", "2", "3", null)); Add(new Person("1", "2", "3", null)); } } В принципе все, должно работать. Пару замечаний по вашему коду: public ObservableCollection MyData; Если вы будете привязываться к MyData то привязка не пройдет. Привязка работает только со свойствами, т.е. должно выглядеть так: public ObservableCollection MyData { get; set; } Как это делается обычно: В проекте должен быть класс VM, реализующий интерфейс INotifyPropertyChanged. Этот класс будет являться DataContext-oм для вашего окна(как задать DataContext). В этом классе и объявить список: public class MainVM : INotifyPropertyChanged { public ObservableCollection MyList { get; set; } public MainVM() { MyList = new ObservableCollection(); MyList.Add(new Person("1", "2", "3", null)); MyList.Add(new Person("1", "2", "3", null)); } //--------------------- //реализация интерфейса } //--------------------- После таких манипуляций, использовать привязку одно удовольствие:

В чём состоит отличие между различными workflow? [дубликат]

#git #контроль_версий #dvcs


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Правильное именование веток
                                
                                    (3 ответа)
                                
                        
                                Закрыт 2 года назад.
            
                    
Слышал о существовании большого количества workflow (процессов разработки) — git
flow, github flow, gitlab flow. 

В чём их сущность и чем они отличаются? Ведь ветвление происходит во всех трёх случаях.
    


Ответы

Ответ 1



Да, все workflow имеют много общего, поскольку предназначены для работы с одними и теми же инструментами (в данном случае с git-ом, распределённой системой контроля версий, обладающей возможностью лёгкого ветвления). Однако у них имеются весьма существенные различия в том, как с этими ветками обращаться. Git Flow Есть две фиксированные ветви, «стабильный» master и «развивающийся» develop. При появлении необходимости внесения изменений в код происходит одно из двух: от develop отпочковывается тематическая ветка, если это внесение функционала или подготовка к выпуску новой версии, либо ветка отпочковывается прямо от master, если это исправление ошибки. После окончания работ тематическая ветвь вливается в её родителя, а в ряде случаев — и в master. GitHub Flow То же, что и Git Flow, но фиксированная ветка всего одна — master; всё остальное принадлежит тематическим ветвям. Тематические ветви, в свою очередь, создаются в форках — клонированных копиях репозитория. То есть центральный репозиторий тематических веток не содержит. В том числе и после слияния, так как метки веток при этом снимаются и их головы становятся анонимными. GitLab Flow Как и в GitHub Flow, фиксированная ветка всего одна — master; всё остальное принадлежит тематическим ветвям. Однако, если в том случае релизы размещались в коммитах master-a, то здесь для каждого релиза создаётся своя, отдельная ветка. Причём никакого слияния этих веток с родителем не производится. Если ветка отпочковалась, значит она будет жить своей жизнью, получая исправления ошибок в виде отдельных коммитов (возможно, портированных из головы мастера с учётом накопившейся разницы в функционале между ветками). Иллюстрации были взяты из статьи «잘 밤에 쓸데없는 생각하기...». В корейском я не смыслю, но картинки красивые.

найти количество уникальных чисел в массиве java

#java


Напишите метод uniqueCount, который будет находить количество уникальных чисел в
массиве. Если число повторяется больше одного раза, то его стоит учитывать, но только
один раз. Длина массива > 0.

Пример:


  Входящие данные  {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11}
  
  Ответ 7
  
  Объяснение
  Массив без повторений будет выглядеть 4, 5, 10, 11, 12,
  44, 100 - длина 7.


Помогите с решением задачи.

Мой вариант:

public static void main(String[] args) {
    int[] array = {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11, 3};
    System.out.println(uniqueCount(array));
}

static int uniqueCount(int[] array) {
    int result = 0;
    int countUnique = 0;
    int count = 0;
    for (int i = 0; i < array.length; i++) {
        countUnique++;
        for (int j = i + 1; j < array.length; j++) {
            if (array[j] == array[i]) {
                count++;
            }
        }
    }
    return result = countUnique - count;
} 


Но ответ на единицу меньше, чем должен быть. Не понимаю где ошибка моя. Наверное
неправильно задаю j, откуда начинать сравнивать элементы.
    


Ответы

Ответ 1



Ваш алгоритм не учитывает, что числа могут повторяться больше, чем два раза - 11 в Вашем случае. for (int j = i+1; j < array.length; j++) { if (array[j] == array[i]) { count++; break; } }

Ответ 2



Можно решить через множество, которое исключает возможность иметь дубликаты: int[] array = {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11, 3}; System.out.println(array.length); // 12 Set mySet = new HashSet<>(); for (int x : array) { mySet.add(x); } System.out.println(mySet.size()); // 8 Или аналогично через список и проверку наличия элемента: List myList = new ArrayList<>(); for (int x : array) { if (!myList.contains(x)) myList.add(x); } System.out.println(myList.size()); // 8 Ну если обернуть один из алгоритмов в функцию: static int uniqueCount(int[] array) { Set mySet = new HashSet<>(); for (int x : array) { mySet.add(x); } return mySet.size(); } ... int[] array = {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11, 3}; System.out.println(array.length); // 12 System.out.println(uniqueCount(array)); // 8

Ответ 3



Как вариант без использования коллекций или библиотек: public class x { public static void main(String[] args) { int[]x = new int[]{1,1,1,2,2,2,1,3,1,2,5,4}; System.out.println(uniqueCount(x)); } public static int uniqueCount(int[]array){ int[] copy = new int[array.length]; int res = 0; int countNum = 0; int count = 0; for (int i = 0; i

Ответ 4



O(array.length + max_num) ~ O(n+const) int histo [] = new int [max_num]; int [] array = int[] array = {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11, 3}; for(int i =0; i < array.length; i++)histo[array[i]]++; int summ = 0 for(int i =0; i < histo.length;i++){ num = histo[i]; if(num >0) summ++; } System.out.println(summ);

Ответ 5



import java.util.Scanner; import java.util.Random; class Z2{ public static void main(String[] args){ String mass[]=new String[5]; String mass2[]=new String[5]; int kol=0,kol_tmp=0; Random rnd=new Random(); //Заполнение массива mass случайными числами for(int i=0;i<=mass.length-1;i++){ mass[i]=String.valueOf(rnd.nextInt(1)); } //Подсчёт количества for(int i=0;i<=mass.length-1;i++){ kol_tmp=0; for(int j=0;j<=mass.length-1;j++){ if(mass[i].equals(mass2[j])) kol_tmp++; } if(kol_tmp==0){ mass2[kol]=mass[i]; kol++; } } //Вывод массива1 System.out.println("mass"); for(int i=0;i<=mass.length-1;i++){ System.out.print(mass[i]+" "); } System.out.println(""); //Вывод массива2 System.out.println("mass2"); for(int i=0;i<=mass.length-1;i++){ System.out.print(mass2[i]+" "); } System.out.println("\nКоличество различных элементов ="+kol); } }