Поддержка по умолчанию xinclude в Java 6?

Здесь есть пара проблем, связанных с тем, как работает оператор по модулю. a % b фактически дает вам остаток, когда вы делите a на b. Итак, давайте предположим, что мы вычисляем числа по модулю 4. Давайте также предположим, что RAND_MAX = 6, потому что я действительно не хочу иметь 32768+ строк в моей таблице.

  a | a % 4
------------
  0 | 0
  1 | 1
  2 | 2
  3 | 3
  4 | 0
  5 | 1
  6 | 2

Итак, если вы используете свой подход для генерации случайных чисел от 1 до 4, у вас есть две проблемы. Во-первых, простой: вы генерируете числа от 0 до 3, а не от 1 до 4. Результат оператора по модулю всегда будет между 0 и модулем.

Другая проблема более тонкая. Если RAND_MAX не делится равномерно на модуль, вы не получите одинаковую вероятность каждого числа. В нашем примере есть 2 способа сделать 0-2, но только 3. Таким образом, 3 будет происходить в ~ 14,3% времени, а каждое другое число будет происходить в ~ 28,6% времени. Чтобы получить равномерное распределение, вам нужно найти способ справиться со случаями, когда RAND_MAX не делится равномерно.

9
задан starblue 24 February 2009 в 14:53
поделиться

1 ответ

Согласно спецификации, поддержка была там начиная с Java 1.5 (5). Я полагаю, что поддержка XInclude полагается на осведомленность пространства имен, которая выключена по умолчанию по назад причинам совместимости.

public class XIncludeDemo {

    private static final String XML = "<?xml version=\"1.0\"?>\n"
            + "<data xmlns=\"foo\" xmlns:xi=\"http://www.w3.org/2001/XInclude\">\n"
            + "<xi:include href=\"include.txt\" parse=\"text\"/>\n"
            + "</data>\n";

    private static final String INCLUDE = "Hello, World!";

    public static void main(String[] args) throws Exception {
        // data
        final InputStream xmlStream = new ByteArrayInputStream(XML
                .getBytes("UTF-8"));
        final InputStream includeStream = new ByteArrayInputStream(INCLUDE
                .getBytes("UTF-8"));
        // document parser
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setXIncludeAware(true);
        factory.setNamespaceAware(true);
        DocumentBuilder docBuilder = factory.newDocumentBuilder();
        if (!docBuilder.isXIncludeAware()) {
            throw new IllegalStateException();
        }
        docBuilder.setEntityResolver(new EntityResolver() {
            @Override
            public InputSource resolveEntity(String publicId, String systemId)
                    throws SAXException, IOException {
                if (systemId.endsWith("include.txt")) {
                    return new InputSource(includeStream);
                }
                return null;
            }
        });
        Document doc = docBuilder.parse(xmlStream);
        // print result
        Source source = new DOMSource(doc);
        Result result = new StreamResult(System.out);
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(source, result);
    }

}
14
ответ дан 4 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: