Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> требуется помощь в оценке кода, посмотреть на код глазами гуру 
V
    Опции темы
le_chat
Дата 26.10.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет



суть проблемы: получил тестовое задание, выполнил, отправил. код рабочий.
в коде - два основных класса (список и его элемент) и несколько совсем маленьких.

очень хочу показать код гуру на предмет выявления того - как на яве делать не стоило или что не соответствовало заданию (то есть на предмет криминала), но знакомого гуру к сожалению нету.
если бы кто-нить согласился посмотреть - был бы очень благодарен.

все выкладывать наверно здесь не стоит поэтому вот мое мыло


PM MAIL   Вверх
serious
Дата 26.10.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: 1
Всего: 1



А гуру должен также взломать твое мыло, чтобы посмотреть код?  smile 


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
Metal_Heart
Дата 26.10.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



serious, иначе это не гуру  smile 


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
LSD
Дата 26.10.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



le_chat, форум предназначен для коллективного обсуждения проблем, а не для обмена e-mail-ами. Если тебе есть что показать, выкладывай это здесь. Если эта информация секретная, по тем или иным причинам, то тогда тем более не следует ее отдавать малознакомому человеку.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
le_chat
Дата 26.10.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет



не секретная. просто много. вот сформулиолванная задача:
Цитата

Разработать класс Item, обладающий следующими аттрибутами:
ID - уникальный идентификатор, строка, имеющая следующий формат:
     две заглавные латинские буквы + четыре десятичные цифры
     (например: AA0001)
DESC - описание, строка (необязательный атрибут)
WEIGHT - вес, положительное 32-битное число с плавающей точкой, согласно IEEE 754
TYPE - тип, одно из FOOD,TOOLS,MISC

Класс должен соответсвовать спецификации JavaBean, и корректную семантику для сравнения и 
преобразования в строку.

Необходимо предусмотреть проверку значений аттрибутов согласно описанию данному выше, и не
допускать создание или модификацию объектов таким образом чтобы ограничения были нарушены.

Разработать класс ItemGroup, агрегирующий множество объектов класса Item и допускающий
следующие операции:
1. Добавление объекта Item, причем если объект Item с таким идентификатором (ID) уже добавлен
его необходимо перезаписать.
2. Удаление объекта по ID
3. Получение списка объектов Item, отсортированного a) по WEIGHT, b) по ID, с) по DESC.
4. Получение среза объектов Item по типу (TYPE), т.е. подмножества всех объектов.
5. Нахождение пересечения и дополнения между двумя объектами ItemGroup,
причем результатом этих операция должен явиться новый объект ItemGroup.
6. Получение среднего веса (WEIGHT) всех объектовданной ItemGroup, округленного 
до двух знаков после запятой.

Для операций 3, 4 возвращаемый список не должен допускать модификации.

Разработать механизм сохранения/загрузки объектов ItemGroup в/из файла:
при помощи стандартного механизма сериализации Java, или используя механизм Java Properties
или в/из XML формата.
Предусмотреть унифицированный механизм обработки низкоуровневых ошибок сохранения/загрузки
данных.

Предусмотреть возможность расширения системы дополнительным способом сохранения данных,
(например сохранения их в реляционную БД), так чтобы механизм сохранения данных можно было 
легко выбирать.

Разработать тестовый класс демострирующий создание объектов ItemGroup, наполнения их объектами
Item, и основные операции над ними, также сохранение и загрузку этих объектов в/из файла.


Добавлено @ 16:10 
class Item
Код

import java.io.Serializable;

public class Item implements Serializable, Comparable {
    public static final int FOOD = 0;
    public static final int TOOLS = 1;
    public static final int MISC = 2;

    private static IIdGenetator idGenerator = new IdGenerator();

    /**
     * Method set new id-generator. Generator must return unique value.
     * Default generator is instance of Generator class.
     *
     * @param generator
     */
    public static void setIdGenerator(IIdGenetator generator) {
        if (generator != null) idGenerator = generator;
    }
    
    private String id;
    private String desc = "";
    private float weight = 0.0f;
    private int type = FOOD;

    private Item() {
    }

    /**
     * Constructor initialize instance of Item. If values desc, weight or type will be wrong, instance will save default value.
     *
     * @param desc   is any String but it is not null; default value is ""
     * @param weight is any positive float or 0; default value is 0.0f
     * @param type   is one of following values: FOOD, TOOLS or MISC; default value is FOOD
     */
    public Item(String desc, float weight, int type) throws Exception {
        this.id = idGenerator.getId();
        setDesc(desc);
        setWeight(weight);
        setType(type);
    }

    /**
     * Return id
     *
     * @return id
     */
    public String getId() {
        return id;
    }

    /**
     * Return Desc
     *
     * @return Desc
     */
    public String getDesc() {
        return desc;
    }

    /**
     * Set desc
     *
     * @param desc is any String, but it is not null
     */
    public void setDesc(String desc) {
        if (desc != null) this.desc = desc;
    }

    /**
     * Return weight
     *
     * @return weight
     */
    public float getWeight() {
        return weight;
    }

    /**
     * Set weight
     *
     * @param weight - positive float or 0
     */
    public void setWeight(float weight) {
        if (weight >= 0) this.weight = weight;
    }

    /**
     * Return type
     *
     * @return one of following values: FOOD, TOOLS or MISC
     */
    public int getType() {
        return type;
    }

    /**
     * Set type.
     *
     * @param type is one of following values
     */
    public void setType(int type) {
        if (type == FOOD || type == TOOLS || type == MISC) this.type = type;
    }

    /**
     * Method compare current item with another Item object. It is implement Comparable interface.
     *
     * @param o - another object
     * @return a negative integer, zero, or a positive integer as this object
     *         is less than, equal to, or greater than the specified object.
     * @throws ClassCastException
     */
    public int compareTo(Object o) throws ClassCastException {
        if (o instanceof Item) {
            Item item = (Item) o;
            return (this.id.compareTo(item.id));
        } else throw new ClassCastException();
    }

    /**
     * Method return his unique id;
     *
     * @return unique id
     */
    public String toString() {
        return id;
    }

    /**
     * The <code>IIdGenetator</code> interface define object forming id for instance
     * of Item class
     */
    public static interface IIdGenetator {
        String getId() throws Exception;
    }

    /**
     * The <code>IdGenetator</code> class is default "id" generator for instance
     * of Item class
     */
    public static class IdGenerator implements IIdGenetator {
        protected static IdGenerator idGenarator = null;

        /**
         * Method return instance of generator.
         *
         * @return Generator
         */
        public static IdGenerator getInstance() {
            if (idGenarator == null) idGenarator = new IdGenerator();
            return idGenarator;
        }

        protected char[] current = {'A', 'A', '0', '0', '0', '0'};

        private IdGenerator() {
        }

        //true - if success
        protected boolean next() {
            current[5]++;
            if (current[5] > '9') {
                current[5] = '0';
                current[4]++;
                if (current[4] > '9') {
                    current[4] = '0';
                    current[3]++;
                    if (current[3] > '9') {
                        current[3] = '0';
                        current[2]++;
                        if (current[2] > '9') {
                            current[2] = '0';
                            current[1]++;
                            if (current[1] > 'Z') {
                                current[1] = 'A';
                                if (current[0] > 'Z') return false;
                                else current[0]++;
                            }
                        }
                    }
                }
            }
            return true;
        }

        /**
         * Method return next unique id for item.
         *
         * @return unique id
         */
        public String getId() throws Exception {
            String result = new String(current);
            if (!next()) throw new Exception("unique values are finished");
            return result;
        }
    }
}


PM MAIL   Вверх
le_chat
Дата 26.10.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет



class List - нередактируемый список. написан как сортируемый по id итема
 
Код

import java.util.Vector;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;

public class List implements Serializable {
    public final static int SORT_BY_WEIGHT = 0;
    public final static int SORT_BY_ID = 1;
    public final static int SORT_BY_DESC = 2;

    protected static float roundWeight(float n) {
        return ((float) Math.round(n * 100)) / 100;
    }

    private Vector list = new Vector();

    /**
     * Add item in sorted by id list
     *
     * @param nItem
     */
    void addItem(Item nItem) {
        if (nItem == null) return;

        String id = nItem.getId();
        int fi = 0, li = list.size() - 1, i = fi, comp = 0;
        while (fi <= li) {
            comp = id.compareTo(getItem(i).getId());
            if (comp < 0) {
                li = i - 1;
                i = fi + ((li - fi) >> 1);
            } else if (comp > 0) {
                fi = i + 1;
                i = fi + ((li - fi) >> 1);
            } else {// so item was found
                list.removeElementAt(i);
                break;
            }
        }

        if (comp < 0)
            list.insertElementAt(nItem, i);
        else if (comp > 0)
            list.insertElementAt(nItem, i + 1);
        else
            list.insertElementAt(nItem, i);
    }

    /**
     * Method return item by index. The first index is 0;
     *
     * @param index
     * @return item
     */
    public Item getItem(int index) {
        return (Item) list.get(index);
    }

    /**
     * Method remove item with so id from list. If item with so id will not be found nothing will be done.
     *
     * @param id - id of item
     */
    protected void removeItem(String id) {
        if (!list.isEmpty()) {
            int fi = 0, li = list.size() - 1, i = li, comp;
            while (true) {
                comp = id.compareTo(getItem(i).getId());

                if (comp < 0) {
                    li = i - 1;
                    if (fi > li) return;
                    else i = li - ((li - fi) >> 1);
                } else if (comp > 0) {
                    fi = i + 1;
                    if (fi > li) return;
                    else i = fi + ((li - fi) >> 1);
                } else {
                    list.remove(i);
                    return;
                }
            }
        }
    }

    /**
     * Method find item by id
     *
     * @param id
     * @return index of item with id
     */
    public int findItem(String id) {
        int fi = 0, li = list.size() - 1, i = li, comp;
        while (fi <= li) {
            comp = id.compareTo(getItem(i).getId());
            if (comp < 0) {
                li = i - 1;
                i = li - ((li - fi) >> 1);
            } else if (comp > 0) {
                fi = i + 1;
                i = fi + ((li - fi) >> 1);
            } else return i;
        }
        return -1;
    }

    /**
     * Method return size of list
     *
     * @return size of list
     */
    public int getSize() {
        return list.size();
    }

    /**
     * Returned ItemGroup object include items which are included in the both "this" and group lists
     * We cann't suppose about comparative criterion which is being used in method compareTo(),
     * because this method is not final, that why simple search was used.
     *
     * @param group
     * @return ItemGroup list of items
     */
    protected ItemGroup getAndList(ItemGroup group) {
        ItemGroup list = new ItemGroup();
        Item item;
        int j = this.list.size() - 1;
        while (j >= 0) {
            item = this.getItem(j);
            int i = ((List) group).list.size() - 1;
            while (i >= 0) {
                if (item.compareTo(group.getItem(i)) == 0) {
                    list.addItem(item);
                    break;
                } else i--;
            }
            j--;
        }
        return list;
    }

    /**
     * Returned ItemGroup object include items which are included in the group list
     * and absent in the "this" list.
     * It cann't suppose about comparation criterion used in method compareTo(),
     * because this method is not final, that why simple search was used
     *
     * @param group
     * @return ItemGroup list of items
     */
    protected ItemGroup getAddToLeftList(ItemGroup group) {
// x y r
// 0 0 0
// 0 1 1
// 1 0 0
// 1 1 0
        ItemGroup list = new ItemGroup();
        Item item;
        int j = ((List) group).list.size() - 1;
        while (j >= 0) {
            item = group.getItem(j);
            int i = this.list.size() - 1;
            while (i >= 0)
                if (item.compareTo(this.getItem(i)) == 0) break;
                else i--;
            if (i < 0) list.addItem(item);
            j--;
        }
        return list;
    }

    /**
     * Method return sorted by sortType list.
     * Method use one pass sorting, one was optimized by speed.
     *
     * @param sortType is one of values SORT_BY_WEIGHT, SORT_BY_ID, SORT_BY_DESC
     * @return sorted list or empty list if sortType isn't SORT_BY_WEIGHT, SORT_BY_ID or SORT_BY_DESC
     */

    protected List getSortedList(int sortType) {
        List list = new List();
        if (sortType == SORT_BY_DESC) {
            Item item;
            String desc;
            int comp = 0, j = this.list.size() - 1, fi, li, i;
            while (j >= 0) {
                item = getItem(j);
                desc = item.getDesc();
                fi = 0;
                li = list.list.size() - 1;
                i = fi;
                while (fi <= li) {
                    comp = desc.compareTo(list.getItem(i).getDesc());
                    if (comp < 0) {
                        li = i -1;
                        i = li - ((li - fi) >> 1);
                    } else if (comp > 0) {
                        fi = i +1;
                        i = fi + ((li - fi) >> 1);
                    } else break;
                }
                if (comp <= 0)
                    list.list.insertElementAt(item, i);
                else if (comp > 0)
                    list.list.insertElementAt(item, i +1);
                j--;
            }
        } else if (sortType == SORT_BY_WEIGHT) {
            Item item;
            float weight;
            int comp = 0, j = this.list.size() - 1, fi, li, i;
            while (j >= 0) {
                item = getItem(j);
                weight = item.getWeight();
                fi = 0;
                li = list.list.size() - 1;
                i = fi;
                while (fi <= li) {
                    comp = Float.compare(weight, list.getItem(i).getWeight());
                    if (comp < 0) {
                        li = i -1;
                        i = li - ((li - fi) >> 1);
                    } else if (comp > 0) {
                        fi = i +1;
                        i = fi + ((li - fi) >> 1);
                    } else break;
                }
                if (comp <= 0)
                    list.list.insertElementAt(item, i);
                else if (comp > 0)
                    list.list.insertElementAt(item, i +1);
                j--;
            }
        } else if (sortType == SORT_BY_ID) {
            int i = 0, last = this.list.size() - 1;
            while (i <= last) {
                list.list.insertElementAt(getItem(i), i);
                i++;
            }
        }
        return list;
    }

    /**
     * Returned list include all items with type "type"
     *
     * @param type may be one the next values: Item.FOOD, Item.TOOL, Item.MISC
     * @return list
     */
    public List getItemsByType(int type) {
        List list = new List();
        Item item;
        int i = 0, last = this.list.size() - 1;
        while (i <= last) {
            item = getItem(i);
            if (item.getType() == type) list.list.add(item);
            i++;
        }
        return list;
    }

    /**
     * Method return avarage weight of all items
     *
     * @return avarage weight
     */

    public float getAverageWeight() {
        float aWeight = 0;
        int i = list.size() - 1;
        while (i >= 0) {
            aWeight += getItem(i).getWeight();
            i--;
        }
        return roundWeight(aWeight / list.size());
    }
}


class ItemGroup - редактируемый - наследник от List
Код


import java.io.Serializable;

public class ItemGroup extends List implements Serializable {

    /**
     * Add item in sorted by id list
     * @param nItem
     */
    public void addItem(Item nItem) {
        super.addItem(nItem);
    }

    /**
     * Method remove item with id from list. If so id will not be found nothing will be done.
     * @param id - id of item
     */
    public void removeItem(String id) {
        super.removeItem(id);
    }

    /**
     * Returned ItemGroup object include items which are included in the both "this" and group lists
     * It cann't suppose about comparation criterion used in method compareTo(),
     * because this method is not final, that why simple search was used
     *
     * @param group
     * @return ItemGroup list of items
     */
    public ItemGroup getAndList(ItemGroup group) {
        return super.getAndList(group);
    }

    /**
     * Returned ItemGroup object include items which are included in the group list
     * and absent in the "this" list.
     * It cann't suppose about comparation criterion used in method compareTo(),
     * because this method is not final, that why simple search was used
     *
     * @param group
     * @return ItemGroup list of items
     */
    public ItemGroup getAddToLeftList(ItemGroup group) {
        return super.getAddToLeftList(group);
    }


    /**
     * Method return list sorted by sortType.
     * Method use one pass sorting, one was optimized by speed.
     * @param sortType is one of values SORT_BY_WEIGHT, SORT_BY_ID, SORT_BY_DESC
     * @return sorted list or empty list if sortType isn't SORT_BY_WEIGHT, SORT_BY_ID or SORT_BY_DESC
     */
    public List getSortedList(int sortType) {
        return super.getSortedList(sortType);
    }
}


последний - class Main - он же запускаемый, он же демострация. - придумал как смог.
Код

import java.util.Random;
import java.io.*;

public class Main {
    private static Random rand = new Random();

    private static void printList(List list){
        System.out.println("=============================");
        String[] typeAdapter = {"FOOD","TOOLS","MISC"};
        Item item;
        int i = 0, last = list.getSize() -1;
        while (i <= last){
            item = list.getItem(i);
            System.out.println(" id: " + item.getId() +  " weigth:" + item.getWeight() + " type:" + typeAdapter[item.getType()] + " desc:" + item.getDesc());
            i++;
        }
        System.out.println("------------------------");
        System.out.println("list size: " + list.getSize() + ", avarage weight: " + list.getAverageWeight());
        System.out.println("=============================");
    }

    private static void fillList(ItemGroup list, int num) throws Exception{
        while (num > 0){
            list.addItem(new Item(("item num " + num), (float)rand.nextDouble()* 100, rand.nextInt(3)));
            num--;
        }
    }

    private static void remove(ItemGroup list, String id){
        System.out.println("remove from list item wiht id:" + id);
        list.removeItem(id);
    }

    private static void press() throws IOException{
        System.out.println("press <Enter>");
        System.in.read();
        System.in.read();
    }

    private static void saveList(List list){
        FileOutputStream fo;
        try {
            fo = new FileOutputStream("list.ser");
            ObjectOutputStream oo = new ObjectOutputStream(fo);
            oo.writeObject(list);
            oo.flush();
            oo.close();
            fo.close();
        } catch (FileNotFoundException e){
            e.printStackTrace(System.out);
        } catch (IOException e){
            e.printStackTrace(System.out);
        }
    }

    private static ItemGroup loadList(){
        try {
            FileInputStream fi = new FileInputStream("list.ser");
            ObjectInputStream oi = new ObjectInputStream(fi);
            ItemGroup list = (ItemGroup) oi.readObject();
            oi.close();
            fi.close();
            return list;
        } catch (FileNotFoundException e){
            e.printStackTrace(System.out);
        } catch (IOException e) {
            e.printStackTrace(System.out);
        } catch (ClassNotFoundException e){
            e.printStackTrace(System.out);
        }
        return null;
    }

    public static void main(String[] args){
        ItemGroup list1;
        List list3;
        try {
            System.out.println("\nthis is demonstration of work classes Item, List, ItemGroup\n");
            list1 = new ItemGroup();
            System.out.println("list is empty:");
            printList(list1);
            System.out.println("\nnow we will fill the list");
            System.out.println("50 items will put in the list, type and weight will be generated random");
            System.out.println("following methods of class Item will be tested: getId, getDesc, setDesc, getWeight, setWeight, getType, setType");
            System.out.println("following methods of class Generator will be tested: getId");
            System.out.println("following methods of class ItemGroup will be tested: addItem, getAverageWeight, getItem, getSize");
            press();
            fillList(list1, 50);
            printList(list1);
            press();

            System.out.println("\nwe will remove from the list item with id: AA0011, AA0022, AA0033, AA0044, AA0055");
            System.out.println("attention! the item of id: AA0055 is not present in the list now");
            System.out.println("following methods of class ItemGroup will be tested: removeItem");
            press();
            remove(list1, "AA0011");
            remove(list1, "AA0022");
            remove(list1, "AA0033");
            remove(list1, "AA0044");
            remove(list1, "AA0055");
            press();
            printList(list1);
            press();

            System.out.println("\nnow we will get a new list from current where all items will have type=\"FOOD\"");
            System.out.println("following methods of class ItemGroup will be tested: getItemsByType");
            press();
            list3 = list1.getItemsByType(Item.FOOD);
            printList(list3);
            press();
            System.out.println("\nnow we will get a new list where all itemds will have type=\"TOOLS\"");
            list3 = list1.getItemsByType(Item.TOOLS);
            press();
            printList(list3);
            press();

            System.out.println("\nnow we will sort list by weight");
            System.out.println("we will test following methods of class ItemGroup: getSortedList");
            press();
            list3 = list1.getSortedList(List.SORT_BY_WEIGHT);
            printList(list3);
            press();

            System.out.println("\nnow we will sort list by desk");
            press();
            list3 = list1.getSortedList(List.SORT_BY_DESC);
            printList(list3);
            press();

            System.out.println("\nnow we will again sort list by weight");
            press();
            list3 = list1.getSortedList(List.SORT_BY_WEIGHT);
            printList(list3);
            press();

            System.out.println("\nnow we will sort list by id");
            press();
            list3 = list1.getSortedList(List.SORT_BY_ID);
            printList(list3);
            press();

            System.out.println("now we will try to serialize list in the file list.ser in current directory");
            press();
            saveList(list1);
            System.out.println("let's clear list");
            list1 = new ItemGroup();
            printList(list1);
            press();

            System.out.println("we will try to deserialize list from file list.ser");
            press();
            list1 = loadList();
            if (list1 != null){
                System.out.println("deserializable completed successfully");
                printList(list1);
            } else {
                System.out.println("deserializable was unsuccessful");
            }
            press();

            System.out.println("\nthe end\n");
        } catch (IOException e) {
            e.printStackTrace(System.out);
        } catch (Exception e){
            e.printStackTrace(System.out);
        }
    }
}


Добавлено @ 16:13 
насчет сохранения/загрузки в задании честно говоря не догнал - почему стандартной сериализации не достаточно?
PM MAIL   Вверх
w1nd
Дата 26.10.2006, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Э-э... Я не знаю, подпадаю ли я под категорию "гуру", да и не вникал особо smile НО:
  • вместо реализации самопального немодифицируемого списка я бы унаследовал функциональность java.util.AbstractList, реализовав там всего два очень простых метода;
  • есть такой интерфейс - java.lang.Comparable, а еще класс java.util.Collections, где в методе sort() реализован эффективный алгоритм сортировки;
  • фраза "уникальный идентификатор, строка, имеющая следующий формат: две заглавные латинские буквы + четыре десятичные цифры (например: AA0001)" имеет смысл разве что для сортировки, а вот какой-либо связи с генерацией ключей нет;
  • "обработка" не подразумевает только вывода информации о низкоуровневой ошибке.


Это сообщение отредактировал(а) w1nd - 26.10.2006, 21:43


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
le_chat
Дата 26.10.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет



спасибо за ответ, но поправьте меня если я не прав:
     AbstractList допускает модификацию списка (так как реализует интерфейс List) чего нельзя делать по условию (список-то должен быть немодифицируемый);
    java.lang.Comparable реализован в классе Item, но так как из задания нельзя толком понять как требуется сравнивать Item'ы - они сравниваются по id;
    требование про генерацию было высказано вместе с выдачей задания;
    реализованный список представляет собой список, сортированный по полю id - поэтому поиск по этому полю в списке - самый быстрый из возможных - в худшем случае 8-9 итераций на сотню значений;
    пересортировка по другим полям осуществляется тоже с учетом того что списки сортированные - поэтому здесь торможения не придвидится;
    насчет обработки - здесь согласен - хотя с другой стороны применять этот класс будет не конечный пользователь - и если просто указать что "в процессе IO произошла ошибка" - это тоже не больно вразумительное сообщение... если честно - то просто не знал чего туда можно запихать....
    
PM MAIL   Вверх
LSD
Дата 26.10.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(le_chat @  26.10.2006,  23:08 Найти цитируемый пост)
AbstractList допускает модификацию списка (так как реализует интерфейс List) чего нельзя делать по условию (список-то должен быть немодифицируемый);

На этот счет есть два варианта: использовать обертку Collections.unmodifiableList(), или переопределить все методы которые модифицируют список и просто выбрасывать UnsupportedOperationException.




--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
w1nd
Дата 27.10.2006, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(le_chat @  26.10.2006,  23:08)
AbstractList допускает модификацию списка (так как реализует интерфейс List) чего нельзя делать по условию (список-то должен быть немодифицируемый);

Нет, не допускает.
Цитата(LSD @ 26.10.2006,  22:17)
<...> или переопределить все методы которые модифицируют список и просто выбрасывать UnsupportedOperationException.

Именно так и сделано в AbstractList smile 

Цитата(le_chat @  26.10.2006,  23:08)
java.lang.Comparable реализован в классе Item, но так как из задания нельзя толком понять как требуется сравнивать Item'ы - они сравниваются по id

Это я попутался, прошу прощения, хотел написать java.util.Comparator (в принципе, мою мысль можно было бы и так понять, просмотрев все варианты Collections.sort()  smile).

З. Ы. Да, и на счёт торможения я бы меньше всего беспокоился. Задачи, при решении которых контейнеры начинают заметно (не сильно, а заметно) тормозить процесс, довольно редки.


Это сообщение отредактировал(а) w1nd - 27.10.2006, 00:08


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
le_chat
Дата 27.10.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет



Цитата

 Нет, не допускает.

сори - не досмотрел - действительно не допускает  smile  
но весь механизм списка нужно либо делать самому, либо агрегировать от какого-нибудь другого списка. в моей реализации он кстати и агренирован от Vector... 
Тогда с своей колокольни я разглядел следующий вариант - ImageGroup (тот что модифицируемый) - унаследовать от AbstractList, в него положить Vector - который и будет в себе держать список. А для возврата немодифицируемых списков использовать вариант, предложенный LSD - создавать тот же Vector и после заполнения возвращать через Collections.unmodifiableList()...

 а что можно сделать с сохранением/восстановлением? она в Main показана через сериализацию... но есть ощущение что здесь можно подправить...

   
PM MAIL   Вверх
LSD
Дата 27.10.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(le_chat @  27.10.2006,  12:52 Найти цитируемый пост)
 а что можно сделать с сохранением/восстановлением? она в Main показана через сериализацию... но есть ощущение что здесь можно подправить...

Сериализация объектов в XML

Добавлено @ 14:39 
А по поводу сохранения в произвольное место. Сделай интерфейс
Код
public interface Serializator
{
  public void serialize(Item item);

  public void close();
}

И создай класс, который будет сохранять объекты из списка используе переданный Serializator.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
le_chat
Дата 27.10.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет



cпасибо

в статье сериализуемые классы не применяют Serializable. для XMLEncoder/XMLDecoder это не обязательно?
PM MAIL   Вверх
LSD
Дата 27.10.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(le_chat @  27.10.2006,  15:45 Найти цитируемый пост)
в статье сериализуемые классы не применяют Serializable. для XMLEncoder/XMLDecoder это не обязательно?

Не обязательно, главное чтобы они соответсвовали спецификации JavaBeans.

Добавлено @ 15:52 
Да и еще, по поводу твоего кода:
Код
public void setWeight(float weight)
{
  if(weight >= 0)
    this.weight = weight;
}

это есть не здорово. Если были переданы некорректные данные, программист никак об этом не узнает. В таких случаях принято выбрасывать исключение:
Код
public void setWeight(float weight)
{
  if(weight >= 0)
    this.weight = weight;
  else
    throw new IllegalArgumentException("Weight must be >= 0");
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
le_chat
Дата 27.10.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет



 всем гуру спасибо за помощью smile     думаю что тема исчерпана
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1018 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.