Java.Help

  • Автор теми AkeL.php
  • Дата створення

xwandi

mafia(:
Если есть возможность откажись от применения метода compareTo(T o). Тогда отпадет необходимость экстендиться от интерфейса и приводить типы много раз.
 

Пух

كنت بلهاء
Модератор
Если есть возможность откажись от применения метода compareTo(T o). Тогда отпадет необходимость экстендиться от интерфейса и приводить типы много раз.
эм, и как от него избавиться? Как тогда сравнивать объекты?

Код:
public class ArrayVector<T extends Number & Comparable> {

    private T[] element;

    public ArrayVector(int size) {
        element = (T[])new Number[size];
    }

    public T get(int index) {
        return element[index];
    }

    public void set(int index, T value) {
        element[index] = value;
    }

    public int size() {
        return element.length;
    }

    public T min() {
        T min = this.get(0);
        for (int i = 0; i < this.size(); i++) {
            if (min.compareTo(this.get(i)) > 0) {
                min = this.get(i);
            }
        }
        return min;
    }
    
    public static void main(String args[]){
        ArrayVector<Double> vector = new ArrayVector<Double>(5);
        for (int i = 0; i < vector.size(); i++){
            vector.set(i,Math.random()*100);
            System.out.println(vector.get(i));
        }
        System.out.println("min = " + vector.min());
    }
}
так работает, без постоянного приведения типа. Но, это не совсем то.
2Hamster
не хочется постоянно приводить типы. По-другому никак сделать нельзя?
 

dreamer

Member
эм, и как от него избавиться? Как тогда сравнивать объекты?

так работает, без постоянного приведения типа. Но, это не совсем то.
2Hamster
не хочется постоянно приводить типы. По-другому никак сделать нельзя?
Код:
import java.util.*;

public class ArrayVector<T> {

    private T[] element;

    @SuppressWarnings("unchecked")
    public ArrayVector(int size) {
        element = (T[]) new Object[size];
    }

    public T get(int index) {
        return element[index];
    }

    public void set(int index, T value) {
        element[index] = value;
    }

    public int size() {
        return element.length;
    }

    /**
     * Вариант 1. 
     * Поскольку в общем случае элементы ArrayVector несравнимы
     * минимум описываем внешней функцией, которая ставит ограничения
     * на тип элемента.
     */
    public static <T extends Comparable<? super T>> T min(ArrayVector<T> vector) {
        T min = vector.get(0);
        for (int i = 0; i < vector.size(); i++) {
            if (min.compareTo(vector.get(i)) > 0) {
                min = vector.get(i);
            }
        }
        return min;
    }

    /**
     * Вариант 2. 
     * Используем внешний компаратор.
     */
    public T min(Comparator<? super T> comparator) {
        T min = get(0);
        for (int i = 0; i < size(); i++) {
            if (comparator.compare(min, get(i)) > 0) {
                min = get(i);
            }
        }
        return min;
    }
    
    public static void main(String args[]){
        ArrayVector<Double> vector = new ArrayVector<Double>(5);
        for (int i = 0; i < vector.size(); i++){
            vector.set(i,Math.random()*100);
            System.out.println(vector.get(i));
        }
        System.out.println("min = " + min(vector));
        System.out.println("min = " + vector.min(new NativeComparator<Double>()));
    }
    
    static class NativeComparator<T extends Comparable<? super T>> implements Comparator<T> {
        public int compare(T t1, T t2) {
            return t1.compareTo(t2);
        }
    }
}
 

dreamer

Member
Обратите внимание на то, что когда мы пишем
Код:
class Some<T> {
    void <T> some() {
        // тут существует два типа Т, что вызовет ошибку
    }
}
а когда пишем
Код:
class Some<T> {
    static void <T> some() {
        // тут существует только один тип Т, все верно
    }
}
 

Пух

كنت بلهاء
Модератор
dreamer, большое спасибо. То, что я и ожидал услышать.
 

Пух

كنت بلهاء
Модератор
ERROR: 'Software caused connection abort: socket write error'
как с этим бороться ?
Как вообще правильно читать ХМЛ с потока?

Например, простенький хмл:
Код:
<Root>
     <Command>showMessage</Command>
     <Message>Hello World!</Message>
</Root>
Код:
public void parseXMLFromServer(InputStream is) 
                              throws ParserConfigurationException, SAXException, IOException{
    Document doc = getDocument(is);
    Element root = doc.getDocumentElement();
    String command =  
           root.getElementsByTagName("Command").item(0).getFirstChild().getNodeValue();
    if (command.equals("showMessage")) {
        String message = 
               root.getElementsByTagName("Message").item(0).getFirstChild().getNodeValue();
         System.out.println(message);
    }
}
Код:
    public Document getDocument(InputStream is) throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
        f.setValidating(false);
        DocumentBuilder builder = f.newDocumentBuilder();
        return builder.parse(is);
    }

Будет ли такой метод "ждать", пока ХМЛ прийдет с потока? или сразу же бросит исключение?
 
Останнє редагування:

dreamer

Member
как с этим бороться ?
Software caused connection abort часто возникает, когда клиент пытается читать из уже закрытого другим концом соединения.
Проверьте последовательность обмена сообщениями и правильность закрытия потоков.
Хотя конечно эта ошибка может возникать и по другим причинам.
 

Пух

كنت بلهاء
Модератор
Спасибо, с Software caused connection abort: socket write error разобрался. Действительно, сокет закрыт уже был.

Теперь проблема с отправкой хмл через сокет.

На клиенте отправляю серверу хмл через сокет.
//out = socket.getOutputStream();
Transformer t = TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(doc), new StreamResult(out));
Сервер что-то ждет в строчке Document doc = builder.parse(is);

Код:
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
f.setValidating(false);
DocumentBuilder builder = f.newDocumentBuilder();
Document doc = builder.parse(is);
такое чувство, что на клиенте не хватает что-то по типу out.flush();

В тоже время, если на клиенте поменять на
//out = socket.getOutputStream();
Transformer t = TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(doc), new StreamResult(System.out));
, вывести хмл на консоль, то все правильно выводится.
Гугл пока ответ мне не сказал.
 

Пух

كنت بلهاء
Модератор
Ну так есть там этот flush или нет?
Нету, т.к. если написать

out.flush();
Transformer t = TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(doc), new StreamResult(out));
или
Transformer t = TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(doc), new StreamResult(out));
out.flush();
толку нет. Не работает. Подсказали, что нормальный способ передачи через поток.
 
Зверху