Портирование Java (Android) на C# (WinForms)
Я уже писал о заказе на перенос кода C# на Java, а тут хочу рассказать о работе по обратному портированию. Итак, как перенести проект Android, рассчитывающий по формулам различные значения: диапазон, вероятность, степень свободы и критерий хи-квадрата.
Сначала я не хотел браться, так как не работаю с Andriod – там хоть и java, но немного отличающаяся Java, есть нюансы и тонкости. Однако, заказчик давний и хороший, поэтому ршил посмотреть. Исходник оказался состоящим из одного файла MainActivity.java и на первый взгляд не требовал подключения каких-то специфических библиотек, поэтому я решил все-таки сделать этот заказ.
Поля класса MainActivity
private Float[] arrayInt; private int N; private float a, b; private float[] tableHi; private String buff;переводятся просто:
private double[] arrayInt; private int N; private float a, b; private float[] tableHi; private String buff;Далее в программе семь методов и каждый из них необходимо преобразовать из Java в C#. Для примера возьмем метод ReadTableHi()
private void ReadTableHi() { tableHi = new float[21]; File file = new File("/sdcard/","hi.txt"); StringBuilder text = new StringBuilder(); try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; int i = 0; while ((line = br.readLine()) != null) { tableHi[i] = Float.valueOf(line); i++; } br.close(); Toast toast = Toast.makeText(this, "Таблица ХИ-квадрат критерия загружена/ \n Первое значение " + tableHi[0],Toast.LENGTH_LONG); toast.show(); } catch (IOException e) { Toast toast = Toast.makeText(this, e.getMessage(),Toast.LENGTH_LONG); toast.show(); } }Он загружает в программу числа из файла вот в таком формате.
Преобразованный метод получается таким
private void ReadTableHi() { tableHi = new float[21]; string[] lines = File.ReadLines("hi.txt").ToArray(); ; for (int i=0; i< lines.Length; i++) { tableHi[i] = float.Parse(lines[i]); } MessageBox.Show("Таблица ХИ-квадрат критерия загружена \n Первое значение " + tableHi[0]); }Я убрал обработку ошибок, так как мы точно знаем, что файл у нас будет. Или вот метод Generate()
public void Generate(View view) { try{ //Инициализация переменных // - КОЛИЕЧЕСТВО СЛУЧАЙНЫХ ЧИСЕЛ EditText text_N = findViewById(R.id.n_text); N = Integer.valueOf(text_N.getText().toString()); // - НИЖНЯЯ ГРАНИЦА ДИАПАЗОНА EditText text_a = findViewById(R.id.a_text); a = Float.valueOf(text_a.getText().toString()); // - ВЕРХНЯЯ ГРАНИЦА ДИАПАЗОНА EditText text_b = findViewById(R.id.b_text); b = Float.valueOf(text_b.getText().toString()); // - МАССИВ СЛУЧАЙНЫХ ЧИСЕЛ arrayInt = new Float[N]; String helpArrayInt = ""; //Отчистка текстового поля EditText listArray = findViewById(R.id.array_list); listArray.setText(""); //Генерация массива случайных чисел for (int i = 0; i < N; i++){ float randomInt = (float)( Math.random() * (b - a) ) + a; arrayInt[i] = randomInt; helpArrayInt += "[" + randomInt + "]"; } //Отображение массива сл. чисел на экране listArray.setText("Массив случайных чисел из [" + N + "] элементов: \n" + helpArrayInt); //Включение кнопки расчёта Button Cal = findViewById(R.id.cal_bot); Cal.setClickable(true); Cal.setEnabled(true); }catch (Exception e){ EditText listArray = findViewById(R.id.array_list); listArray.setText(e.getMessage()); } }Его аналог на C#:
public void Generate() { try { //Инициализация переменных // - КОЛИЕЧЕСТВО СЛУЧАЙНЫХ ЧИСЕЛ N = (int) numericUpDown1.Value; // - НИЖНЯЯ ГРАНИЦА ДИАПАЗОНА a = (int)numericUpDown2.Value; // - ВЕРХНЯЯ ГРАНИЦА ДИАПАЗОНА b = (int)numericUpDown3.Value; // - МАССИВ СЛУЧАЙНЫХ ЧИСЕЛ arrayInt = new double[N]; String helpArrayInt = ""; //Отчистка текстового поля // EditText listArray = findViewById(R.id.array_list); // listArray.setText(""); //Генерация массива случайных чисел for (int i = 0; i < N; i++) { double randomInt = (double)(RandomNumber() * (b - a)) + a; arrayInt[i] = randomInt; helpArrayInt += "[" + randomInt + "]"; } //Отображение массива сл. чисел на экране textBox1.Text = "Массив случайных чисел из [" + N + "] элементов: \n" + helpArrayInt; } catch (Exception e) { } }Так как в NET нет встроенного метода Math.random() для чисел типа float или double, то приходится писать свой метод:
public double RandomNumber() { string str = "0," + random.Next(0, 99999999).ToString() + random.Next(0, 99999999).ToString(); double fl = Convert.ToDouble(str); return fl; }Так и с остальными функциями. Это интересный процесс. Если вам требуется конвертировать код Java в C# или наоборот – пишите.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.