Читаем Философия Java3 полностью

public static class

Double implements Generator { public java.lang.Double nextO {

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

//• net/mi ndvi ew/uti1/Generated.java package net.mi ndvi ew.uti1, import java.util.*;

public class Generated {

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

public static T[] array(T[] a. Generator gen) {

return new CollectionData(gen, a.length).toArray(a):

}

// Создание нового массива: @SuppressWarnings("unchecked") public static T[] array(Class type. Generator gen. int size) { T[] a =

(T[])java.1ang.ref1ect.Array.newlnstance(type. size); return new CollectionData(gen. size) toArray(a);

}

} ///:-

Класс Collection Data создает объект Collection, заполненный элементами, которые были созданы генератором gen. Количество элементов определяется вторым аргументом конструктора. Все субтипы Collection содержат метод toArray(), заполняющий массив-аргумент элементами из Collection.

Второй метод использует рефлексию для динамического создания нового массива соответствующего типа и размера. Затем созданный массив заполняется таким же способом, как в первом методе.

Чтобы протестировать Generated, мы воспользуемся одним из классов CountingGenerator, описанных в предыдущем разделе:

II: 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.pri ntin(Arrays.toStri ng(a)); a = Generated, array (a, new CountingGenerator.IntegerO); System. out. pri nti n( Arrays. toStri ng(a)): Integer[] b = Generated.array(Integer.class.

new CountingGenerator.IntegerO, 15): System, out. pri nti n(Arrays. toStri ng(b)):

}

} /* Output: [9. 8, 7. 6] [0. 1. 2. 3]

[0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14] *///:-

Хотя массив а инициализируется, эти данные перезаписываются при вызове Generated.array(). Инициализация b показывает, как создать заполненный массив «с нуля».

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

//: net/mi ndvi ew/uti1/ConvertTo.java

package net.mi ndvi ew.uti1;

public class ConvertTo {

public static booleanC] primitive(Boolean[] in) { boolean[] result = new boolean[in.length], for(int i = 0; i < in.length; i++)

result[i] = in[i]; // Автоматическая распаковка return result;

}

public static chart] primitive(Character[] in) { chart] result = new char[in.length]; for(int i = 0; i < in.length; i++)

result[i] = in[i]; return result;

}

public static byte[] primitive(Bytet] in) { bytet] result = new bytetin.length]; for(int i = 0; i < in.length; i++)

resultti] = inti]; return result;

}

public static shortt] primitive(Short[] in) { shortt] result = new shorttin.length]; for(int i = 0; i < in.length; i++)

resultti] = inti]; return result;

}

public static int[] primitivedntegert] in) { intt] result = new int[in.length]: for(int i = 0; i < in.length; i++)

resultti] = inti]; return result;

}

public static longt] primitive(Longt] in) { longt] result = new longtin.length]; for(int i = 0; i < in.length; i++)

resultti] = inti]; return result;

}

public static floatt] primitive(Float[] in) { floatt] result = new floatCin.length]: for(int i = 0; i < in.length, i++)

resultti] = inti]; return result;

public static doublet] primitive(Double[] in) { doublet] 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) {

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

new CountingGenerator.IntegerO. 15); int[] b = ConvertTo.primitive(a); System.out.pri ntin(Arrays.toStri ng(b)); boolean[] с = ConvertTo.primitive(

Generated.array(Boolean.class.

new CountingGenerator.BooleanO, 7)); System. out. pri nti n(Arrays. toStri ng(c));

}

} /* Output:

[0. 1. 2, 3, 4, 5, 6. 7. 8. 9. 10. 11. 12. 13. 14] [true, false, true, false, true, false, true] *///:-

Наконец, следующая программа тестирует инструментарий создания массивов с классами 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 {

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных