русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Public static class


Дата добавления: 2015-06-12; просмотров: 738; Нарушение авторских прав


Double implements Generator<java.lang.Double> {

public java.lang.Double next() {

long trimmed = Math.round(r.nextDouble() * 100);

return ((double)trimmed) / 100;

}

}

}

Как видите, RandomGenerator.String наследует от CountingGenerator.String, просто подключая новый генератор Character. Чтобы генерируемые числа были не слишком велики, RandomGenerator.Integer по умолчанию берет остаток от деления на 10 000, но перегруженный конструктор позволяет выбрать меньшее значение. Аналогичный подход используется и для RandomGenerator.Long. Для генераторов Float и Double цифры в дробной части усекаются. Для тестирования RandomGenerator можно воспользоваться уже готовым классомGeneratorsTest:

//: arrays/RandomGeneratorsTest.java

import net.mindview.util.*;

 

public class RandomGeneratorsTest {

public static void main(String[] args) {

GeneratorsTest.test(RandomGenerator.class);

}

}

<spoiler text="Output:">

Double: 0.73 0.53 0.16 0.19 0.52 0.27 0.26 0.05 0.8 0.76

Float: 0.53 0.16 0.53 0.4 0.49 0.25 0.8 0.11 0.02 0.8

Long: 7674 8804 8950 7826 4322 896 8033 2984 2344 5810

Integer: 8303 3141 7138 6012 9966 8689 7185 6992 5746 3976

Short: 3358 20592 284 26791 12834 -8092 13656 29324 -1423 5327

String: bkInaMe sbtWHkj UrUkZPg wsqPzDy CyRFJQA HxxHvHq XumcXZJ oogoYWM NvqeuTp nXsgqia

Character: x x E A J J m z M s

Byte: -60 -17 55 -14 -5 115 39 -37 79 115

Boolean: false true false false true true true true true true

</spoiler> Чтобы изменить количество генерируемых значений, воспользуйтесь public-полем GeneratorsTest.size.

Создание массивов с использованием генераторов

Для создания массивов на основе Generator нам потребуются два вспомогательных класса. Первый использует произвольный Generator для получения массива типов, производных от Object. Для решения проблемы с примитивами второй класс получает произвольный массив с объектами-«обертками» и строит для него соответствующий массив примитивов.



public static class Double implements Generator<java.lang.Double> {

public java.lang.Double next() {

long trimmed = Math.round(r.nextDouble() * 100);

return ((double)trimmed) / 100;

}

}

Первый вспомогательный класс может работать в двух режимах, представленных перегруженным статическим методом аrrау(). Первая версия метода получает существующий массив и заполняет его с использованием Generator; вторая версия получает объектClass.Generator и количество элементов и создает новый массив, который также заполняется с использованием Generator. Помните, что при этом создаются только массивы субтипов Object, но не массивы при­митивных типов:

//: net/mindview/util/Generated.java

package net.mindview.util;

import java.util.*;

 

public class Generated {

// Заполнение существующего массиваy:

public static <T> T[] array(T[] a, Generator<T> gen) {

return new CollectionData<T>(gen, a.length).toArray(a);

}

// Создание нового массива:

@SuppressWarnings("unchecked")

public static <T> T[] array(Class<T> type,

Generator<T> gen, int size) {

T[] a =

(T[])java.lang.reflect.Array.newInstance(type, size);

return new CollectionData<T>(gen, size).toArray(a);

}

}

Класс CollectionData создает объект Collection, заполненный элементами, которые были созданы генератором gen. Количество элементов определяется вторым аргументом конструктора. Все субтипы Collection содержат метод toArray(), заполняющий массив-аргумент элементами из Collection. Второй метод использует рефлексию для динамического создания нового массива соответствующего типа и размера. Затем созданный массив заполняется таким же способом, как в первом методе. Чтобы протестировать Generated, мы воспользуемся одним из классов CountingGenerator, описанных в предыдущем разделе:

//: arrays/TestGenerated.java

import java.util.*;

import net.mindview.util.*;

 

public class TestGenerated {

public static void main(String[] args) {

Integer[] a = { 9, 8, 7, 6 };

System.out.println(Arrays.toString(a));

a = Generated.array(a,new CountingGenerator.Integer());

System.out.println(Arrays.toString(a));

Integer[] b = Generated.array(Integer.class,

new CountingGenerator.Integer(), 15);

System.out.println(Arrays.toString(b));

}

}

<spoiler text="Output:">

[9, 8, 7, 6]

[0, 1, 2, 3]

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

</spoiler> Хотя массив а инициализируется, эти данные перезаписываются при вызове Generated.array(). Инициализация b показывает, как создать заполненный массив «с нуля». Параметризация не работает с примитивами, поэтому для заполнения примитивных массивов будут использоваться генераторы. Для решения этой проблемы мы создадим преобразователь, который получает произвольный массив объектных «оберток» и преобразует его в массив соответствующих примитивных типов. Без него нам пришлось бы создавать специализированные генераторы для всех примитивов.

//: net/mindview/util/ConvertTo.java

package net.mindview.util;

 

public class ConvertTo {

public static boolean[] primitive(Boolean[] in) {

boolean[] result = new boolean[in.length];

for(int i = 0; i < in.length; i++)

result[i] = in[i]; // Autounboxing

return result;

}

public static char[] primitive(Character[] in) {

char[] result = new char[in.length];

for(int i = 0; i < in.length; i++)

result[i] = in[i];

return result;

}

public static byte[] primitive(Byte[] in) {

byte[] result = new byte[in.length];

for(int i = 0; i < in.length; i++)

result[i] = in[i];

return result;

}

public static short[] primitive(Short[] in) {

short[] result = new short[in.length];

for(int i = 0; i < in.length; i++)

result[i] = in[i];

return result;

}

public static int[] primitive(Integer[] in) {

int[] result = new int[in.length];

for(int i = 0; i < in.length; i++)

result[i] = in[i];

return result;

}

public static long[] primitive(Long[] in) {

long[] result = new long[in.length];

for(int i = 0; i < in.length; i++)

result[i] = in[i];

return result;

}

public static float[] primitive(Float[] in) {

float[] result = new float[in.length];

for(int i = 0; i < in.length; i++)

result[i] = in[i];

return result;

}

public static double[] primitive(Double[] in) {

double[] result = new double[in.length];

for(int i = 0; i < in.length; i++)

result[i] = in[i];

return result;

}

}

Каждая версия primitive() создает примитивный массив правильной длины, а затем копирует элементы из массива in. Обратите внимание на выполнение автоматической распаковки в выражении

result[i] = in[i];

Пример использования ConvertTo с обеими версиями Generated.array():

//: arrays/PrimitiveConversionDemonstration.java

import java.util.*;

import net.mindview.util.*;

 

public class PrimitiveConversionDemonstration {

public static void main(String[] args) {

Integer[] a = Generated.array(Integer.class,

new CountingGenerator.Integer(), 15);

int[] b = ConvertTo.primitive(a);

System.out.println(Arrays.toString(b));

boolean[] c = ConvertTo.primitive(

Generated.array(Boolean.class,

new CountingGenerator.Boolean(), 7));

System.out.println(Arrays.toString(c));

}

}

<spoiler text="Output:">

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

[true, false, true, false, true, false, true]

</spoiler> Наконец, следующая программа тестирует инструментарий создания массивов с классами RandomGenerator:

//: arrays/TestArrayGeneration.java

// Test the tools that use generators to fill arrays.

import java.util.*;

import net.mindview.util.*;

import static net.mindview.util.Print.*;

 

public class TestArrayGeneration {

public static void main(String[] args) {

int size = 6;

boolean[] a1 = ConvertTo.primitive(Generated.array(

Boolean.class, new RandomGenerator.Boolean(), size));

print("a1 = " + Arrays.toString(a1));

byte[] a2 = ConvertTo.primitive(Generated.array(

Byte.class, new RandomGenerator.Byte(), size));

print("a2 = " + Arrays.toString(a2));

char[] a3 = ConvertTo.primitive(Generated.array(

Character.class,

new RandomGenerator.Character(), size));

print("a3 = " + Arrays.toString(a3));

short[] a4 = ConvertTo.primitive(Generated.array(

Short.class, new RandomGenerator.Short(), size));

print("a4 = " + Arrays.toString(a4));

int[] a5 = ConvertTo.primitive(Generated.array(

Integer.class, new RandomGenerator.Integer(), size));

print("a5 = " + Arrays.toString(a5));

long[] a6 = ConvertTo.primitive(Generated.array(

Long.class, new RandomGenerator.Long(), size));

print("a6 = " + Arrays.toString(a6));

float[] a7 = ConvertTo.primitive(Generated.array(

Float.class, new RandomGenerator.Float(), size));

print("a7 = " + Arrays.toString(a7));

double[] a8 = ConvertTo.primitive(Generated.array(

Double.class, new RandomGenerator.Double(), size));

print("a8 = " + Arrays.toString(a8));

}

}

<spoiler text="Output:">

a1 = [true, false, true, false, false, true]

a2 = [104, -79, -76, 126, 33, -64]

a3 = [Z, n, T, c, Q, r]

a4 = [-13408, 22612, 15401, 15161, -28466, -12603]

a5 = [7704, 7383, 7706, 575, 8410, 6342]

a6 = [7674, 8804, 8950, 7826, 4322, 896]

a7 = [0.01, 0.2, 0.4, 0.79, 0.27, 0.45]

a8 = [0.16, 0.87, 0.7, 0.66, 0.87, 0.59]

</spoiler> Как видите, все версии ConvertTo.primitive() работают правильно.

Вспомогательный инструментарий Arrays

В библиотеку java.util включен класс Arrays, содержащий набор вспомогательных статических методов для работы с массивами. Основных методов шесть: equals() сравнивает два массива (также существует версия deepEquals() для многомерных массивов); fill() был описан ранее в этой главе; sort() сортирует массив; binarySearch( ищет элемент в отсортированном массиве; toString() создает представление массива в формате String, a hashCode() генерирует хеш-код массива. Все эти методы перегружены для всех примитивных типов и Object. Кроме того, метод Arrays.asList() преобразует любую последовательность или массив в контейнер List (см. главу 11). Прежде чем обсуждать методы Arrays, следует рассмотреть еще один полезный метод, не входящий в Arrays.

 



<== предыдущая лекция | следующая лекция ==>
Public static class | Копирование массива


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.75 сек.