LINUX.ORG.RU

Красота кода

 ,


0

1

Блин, что-то я совсем запутался и приуныл. Какой вариант нужно использовать? node - вершина графа, node.link - arrayList<Integer> на другие вершины которые имею связь с node. Алгоритм поиска(в ширину или глубину не важно)

for(int i : node.link){
    if(nodes.get(i).type == 0){
        nodes.get(i).type = 1;
        queue.add(nodes.get(i));
        count++;
    }
}

for(int i = 0; i < node.link.size(); i++){
    if(nodes.get(node.link.get(i)).type == 0) {
        nodes.get(node.link.get(i)).type = 1;
        queue.add(nodes.get(node.link.get(i)));
        count++;
    }
}

★★★

java
красота кода

Это там где портянки то? Ха-ха.

entefeed ☆☆☆
()
Ответ на: комментарий от vurdalak

Точно, я так понял это ради производительности? Ну хорошо. А я могу сразу её в цикле получить? Ну то есть for(GraphNode localNode : __Вот тут что нужно написать чтоб получилось?__)

А то сейчас вот так выглядит.

for(int i : node.link){
    GraphNode localNode = nodes.get(i);
    if(localNode.type == 0){
        localNode.type = 1;
        queue.add(localNode);
        count++;
    }
}

abs ★★★
() автор топика
Ответ на: комментарий от abs

Не столько для производительности, сколько для красоты.

vurdalak ★★★★★
()

Назови 0 и 1 нормально, а то говно какое-то невразумительное, непонятно, что происходит.

anonymous
()
Ответ на: комментарий от anonymous

Назови 0 и 1 нормально

Точно, можно же enum сделать.

abs ★★★
() автор топика
Ответ на: комментарий от Bioreactor

Используйте Java 8.

Не уверен что есть смысл ради красивости кода и одной строки пихать туда функциональщину. По крайней мере пока.

abs ★★★
() автор топика
Ответ на: комментарий от crowbar

Хранить инты обязательно? Не легче ли ссылки на ноды хранить?

Вот я сейчас об этом думаю.

abs ★★★
() автор топика
Ответ на: комментарий от anonymous

Назови 0 и 1 нормально

Точно: My.Lovely.Project.Node.Loop.ZERO и My.Lovely.Project.Node.Loop.ONE будет смотреться намного профессиональнее.

anonymous
()
Ответ на: комментарий от anonymous

анон, та вроде все нормально вышло

class graph {
    int NOT_VISIT = 0;
    int     VISIT = 1;
    int LAST_VISIT = 2;

    private class GraphNode {
        ArrayList<Integer> link = new ArrayList<Integer>();
        int type = 0;
    }

    ArrayList<GraphNode> nodes = new ArrayList<GraphNode>();
    ArrayList<Integer> removes = new ArrayList<Integer>();

    int size;
    int MAX_COUNT = 4;

    public void createGraph(int n){
        removes.clear();
        nodes.clear();
        size = n;
        for(int i = 0; i < size; i++){
            nodes.add(new GraphNode());
        }
    }

    public void addEdge(int a, int b){
        nodes.get(a).link.add(b);
        nodes.get(b).link.add(a);
    }

    public void bfs(int startNode){
        int count = 1;
        Queue<GraphNode> queue = new LinkedList();
        queue.add(nodes.get(startNode));
        nodes.get(startNode).type = VISIT;
        while(!queue.isEmpty()) {
            GraphNode node = queue.remove();

            for(int i : node.link){
                GraphNode localNode = nodes.get(i);
                if(localNode.type == NOT_VISIT){
                    localNode.type = VISIT;
                    queue.add(localNode);
                    count++;
                }
            }
        }

        if(count >= MAX_COUNT){
            for(int i = 0; i < nodes.size(); i++){
                if(nodes.get(i).type == VISIT){
                    removes.add(i);
                }
            }
        }

        for(GraphNode node : nodes){
            if(node.type == VISIT){
                node.type = LAST_VISIT;
            }
        }
    }

    public ArrayList<Integer> searchBigGroups(){
        for(int i = 0; i < nodes.size(); i++){
            if(nodes.get(i).type == NOT_VISIT){
                bfs(i);
            }
        }

        Collections.sort(removes, Collections.reverseOrder());
        return removes;
    }
}

abs ★★★
() автор топика
Ответ на: комментарий от abs
            for(int i : node.link){
                GraphNode localNode = nodes.get(i);
                if(localNode.type == NOT_VISIT){
                    localNode.type = VISIT;
                    queue.add(localNode);
                    count++;
                }
            }

Вот у меня вопрос - выделять в цикле память каждый раз для переменной - это хорошо? Я просто обычно пишу:

            GraphNode localNode;
            for(int i : node.link){
                localNode = nodes.get(i);
                if(localNode.type == NOT_VISIT){
                    localNode.type = VISIT;
                    queue.add(localNode);
                    count++;
                }
            }

by_zero
()
Ответ на: комментарий от by_zero

А сам то как думаешь? Вообще в таких случаях нужно брать «дизассемблер» и смотреть что за код ты получаешь.

grouzen ★★
()
Ответ на: комментарий от by_zero

выделять в цикле память каждый раз для переменной - это хорошо?

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

Deleted
()
node.link map { nodes.get(_) } filter { _.type == 0 } map { type = 1; queue.add(_) } length
anonymous
()
Ответ на: комментарий от Deleted

ну хотябы соглашения по оформлению кода почитай
Для открывающих фигурные скобок не выделяется отдельная строка, они находятся в той же строке, что и код перед ними

Что не так?

abs ★★★
() автор топика
Ответ на: комментарий от by_zero

Вот у меня вопрос - выделять в цикле память каждый раз для переменной - это хорошо?

Память выделяется при входе в ф-ю, а не в цикл.

anonymous
()
Ответ на: комментарий от EXL

онож не компилируется, это какойто другой язык, ты зачем его выучил?

Deleted
()

Первый вариант читабельнее. Хотя для жабы идиоматично было бы:

nodes.get(i).setType(1)

:)

Нет, все-таки шарп с его пропертями, перегрузкой операторов и индексаторами мне нравится больше.

ЗЫ. Про то, что вместо индексов можно хранить ссылки на конкретные ноды уже говорили

Midael ★★★★★
()
Последнее исправление: Midael (всего исправлений: 1)
Ответ на: комментарий от anonymous

не переводи давай тему с больной головы на здоровый хер.

darkenshvein ★★★★★
()
Ответ на: комментарий от Midael

nodes.get(i).setType(1)

А какой смысл писать setSomething если можно просто написать obj.something = smtn;

Типа что я смогу в функции setSomething сделать какие-то проверки? Но этож наверное сильно медленнее

abs ★★★
() автор топика
    if(nodes.get(node.link.get(i)).type == 0) {
        nodes.get(node.link.get(i)).type = 1;
        queue.add(nodes.get(node.link.get(i)));

Перед if надо было пробел поставить, тогда бы точки в один столбик легли

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.