From 56153abf85c493c172fc2bc03296e98d03399368 Mon Sep 17 00:00:00 2001 From: iMoHax Date: Fri, 19 Jun 2015 15:58:49 +0300 Subject: [PATCH] modify vectors collection in graph --- .../trader/analysis/graph/AbstractGraph.java | 39 +++++++++++-------- .../java/ru/trader/analysis/graph/Graph.java | 6 ++- .../java/ru/trader/analysis/graph/Vertex.java | 12 +++--- .../ru/trader/analysis/graph/GraphTest.java | 10 +++-- 4 files changed, 41 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/ru/trader/analysis/graph/AbstractGraph.java b/core/src/main/java/ru/trader/analysis/graph/AbstractGraph.java index e576093..8b77c53 100644 --- a/core/src/main/java/ru/trader/analysis/graph/AbstractGraph.java +++ b/core/src/main/java/ru/trader/analysis/graph/AbstractGraph.java @@ -4,11 +4,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.trader.analysis.AnalysisCallBack; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveAction; @@ -19,7 +16,7 @@ public abstract class AbstractGraph implements Graph { private final static Logger LOG = LoggerFactory.getLogger(AbstractGraph.class); protected Vertex root; - protected final Map> vertexes; + protected final List> vertexes; private final GraphCallBack callback; protected int minJumps; @@ -30,7 +27,7 @@ public abstract class AbstractGraph implements Graph { protected AbstractGraph(AnalysisCallBack callback) { this.callback = new GraphCallBack(callback); - vertexes = new ConcurrentHashMap<>(50, 0.9f, THRESHOLD); + vertexes = new CopyOnWriteArrayList<>(); } protected abstract GraphBuilder createGraphBuilder(Vertex vertex, Collection set, int deep, double limit); @@ -43,7 +40,7 @@ public abstract class AbstractGraph implements Graph { minJumps = maxDeep; } else { minJumps = 1; - for (Vertex vertex : vertexes.values()) { + for (Vertex vertex : vertexes) { int jumps = maxDeep - vertex.getLevel(); if (jumps > minJumps) minJumps = jumps; } @@ -52,24 +49,29 @@ public abstract class AbstractGraph implements Graph { } private Vertex getInstance(T entry, int deep){ - Vertex vertex = vertexes.get(entry); + Vertex vertex = getVertex(entry).orElse(null); if (vertex == null) { - LOG.trace("Is new vertex"); - vertex = new Vertex<>(entry); - vertex.setLevel(deep); - vertexes.put(entry, vertex); + synchronized (vertexes){ + vertex = getVertex(entry).orElse(null); + if (vertex == null){ + LOG.trace("Is new vertex"); + vertex = new Vertex<>(entry, vertexes.size()); + vertex.setLevel(deep); + vertexes.add(vertex); + } + } } return vertex; } @Override public boolean isAccessible(T entry){ - return vertexes.containsKey(entry); + return getVertex(entry).isPresent(); } @Override - public Vertex getVertex(T entry){ - return vertexes.get(entry); + public Optional> getVertex(T entry){ + return vertexes.stream().filter(v -> v.isEntry(entry)).findFirst(); } @Override @@ -87,6 +89,11 @@ public abstract class AbstractGraph implements Graph { return root.getLevel() - minJumps; } + @Override + public int getSize() { + return vertexes.size(); + } + protected abstract class GraphBuilder extends RecursiveAction { protected final Vertex vertex; protected final Collection set; diff --git a/core/src/main/java/ru/trader/analysis/graph/Graph.java b/core/src/main/java/ru/trader/analysis/graph/Graph.java index aa4dec2..4f94b28 100644 --- a/core/src/main/java/ru/trader/analysis/graph/Graph.java +++ b/core/src/main/java/ru/trader/analysis/graph/Graph.java @@ -1,13 +1,17 @@ package ru.trader.analysis.graph; +import java.util.Optional; + public interface Graph { boolean isAccessible(T entry); - Vertex getVertex(T entry); + Optional> getVertex(T entry); Vertex getRoot(); int getMinJumps(); int getMinLevel(); + + int getSize(); } diff --git a/core/src/main/java/ru/trader/analysis/graph/Vertex.java b/core/src/main/java/ru/trader/analysis/graph/Vertex.java index af63b29..29f723c 100644 --- a/core/src/main/java/ru/trader/analysis/graph/Vertex.java +++ b/core/src/main/java/ru/trader/analysis/graph/Vertex.java @@ -8,10 +8,12 @@ import java.util.Optional; public class Vertex { private final ArrayList> edges = new ArrayList<>(); private final T entry; + private final int index; private volatile int level = -1; - public Vertex(T entry) { + public Vertex(T entry, int index) { this.entry = entry; + this.index = index; } public T getEntry() { @@ -22,6 +24,10 @@ public class Vertex { return this.entry.equals(entry); } + public int getIndex() { + return index; + } + public void setLevel(int level) { this.level = level; } @@ -51,10 +57,6 @@ public class Vertex { return edges.stream().filter((e) -> e.isConnect(target)).findFirst(); } - public void sortEdges(){ - edges.sort(Comparator.>naturalOrder()); - } - public boolean isConnected(T other){ return getEdge(other).isPresent(); } diff --git a/core/src/test/java/ru/trader/analysis/graph/GraphTest.java b/core/src/test/java/ru/trader/analysis/graph/GraphTest.java index 74156a2..0bd372b 100644 --- a/core/src/test/java/ru/trader/analysis/graph/GraphTest.java +++ b/core/src/test/java/ru/trader/analysis/graph/GraphTest.java @@ -10,6 +10,7 @@ import ru.trader.core.Profile; import ru.trader.core.Ship; import java.util.ArrayList; +import java.util.Optional; public class GraphTest extends Assert { private final static Logger LOG = LoggerFactory.getLogger(GraphTest.class); @@ -89,7 +90,7 @@ public class GraphTest extends Assert { assertFalse(graph.isAccessible(x9)); assertFalse(graph.isAccessible(x10)); - Vertex x = graph.getVertex(x5); + Optional> x = graph.getVertex(x5); // x5 -> x4, x5 -> x6 checkEdges(x, new Point[]{x4, x6}, new Point[]{x1, x2, x3, x7, x8, x9, x10}); // x4 -> x5 @@ -101,7 +102,8 @@ public class GraphTest extends Assert { } - private void checkEdges(Vertex vertex, Point[] trueEdge, Point[] falseEdge){ + private void checkEdges(Optional> v, Point[] trueEdge, Point[] falseEdge){ + Vertex vertex = v.get(); for (Point point : trueEdge) { assertTrue(String.format("%s must have edge to %s", vertex, point), vertex.isConnected(point)); } @@ -133,7 +135,7 @@ public class GraphTest extends Assert { assertFalse(graph.isAccessible(x9)); assertFalse(graph.isAccessible(x10)); - Vertex x = graph.getVertex(x5); + Optional> x = graph.getVertex(x5); // x5 -> x4, x5 -> x6 checkEdges(x, new Point[]{x4, x6}, new Point[]{x1, x2, x3, x7, x8, x9, x10}); // x3 -> x4 @@ -171,7 +173,7 @@ public class GraphTest extends Assert { assertFalse(graph.isAccessible(x9)); assertFalse(graph.isAccessible(x10)); - Vertex x = graph.getVertex(x5); + Optional> x = graph.getVertex(x5); // x5 -> x4, x5 -> x3, x5 -> x6 checkEdges(x, new Point[]{x3, x4, x6}, new Point[]{x1, x2, x7, x8, x9, x10}); // x2 -> x3, x2 -> x4