From 9b79304f736ba04c1f5254842f63aabb45e9d919 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Feb 2026 02:52:43 +0300 Subject: [PATCH 01/24] test1 --- .../java/hse/java/practice/task1/Edge.java | 30 +++ .../hse/java/practice/task1/RubiksCube.java | 234 +++++++++++++++++- 2 files changed, 262 insertions(+), 2 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/Edge.java b/src/main/java/hse/java/practice/task1/Edge.java index d95ba56b..4b002213 100644 --- a/src/main/java/hse/java/practice/task1/Edge.java +++ b/src/main/java/hse/java/practice/task1/Edge.java @@ -1,6 +1,7 @@ package hse.java.practice.task1; import java.util.Arrays; +import java.util.Collections; public class Edge { @@ -27,6 +28,35 @@ public CubeColor[][] getParts() { return parts; } + private void transpose() { + for (int i = 0; i < 3; i++) { + for (int j = i + 1; j < 3; j++) { + CubeColor temp = parts[i][j]; + parts[i][j] = parts[j][i]; + parts[j][i] = temp; + } + } + } + + private void reverse() { + for (int i = 0; i < 3; i++) { + Collections.reverse(Arrays.asList(parts[i])); + } + } + + public void rotate(RotateDirection direction) { + switch (direction) { + case CLOCKWISE -> { + transpose(); + reverse(); + } + case COUNTERCLOCKWISE -> { + reverse(); + transpose(); + } + } + } + public void setParts(CubeColor[][] parts) { this.parts = parts; } diff --git a/src/main/java/hse/java/practice/task1/RubiksCube.java b/src/main/java/hse/java/practice/task1/RubiksCube.java index 2091b657..5a63ae16 100644 --- a/src/main/java/hse/java/practice/task1/RubiksCube.java +++ b/src/main/java/hse/java/practice/task1/RubiksCube.java @@ -1,12 +1,14 @@ package hse.java.practice.task1; + import java.util.Arrays; +import java.util.Collections; /** * Необходимо реализовать интерфейс Cube * При повороте передней грани, меняются верх низ право и лево */ -public class RubiksCube { +public class RubiksCube implements Cube { private static final int EDGES_COUNT = 6; @@ -26,10 +28,238 @@ public RubiksCube() { } } + private int[] getAdjacentFaces(EdgePosition pos) { + return switch (pos) { + case UP -> new int[]{4, 2, 5, 3}; + case DOWN -> new int[]{4, 3, 5, 2}; + case LEFT -> new int[]{0, 4, 1, 5}; + case RIGHT -> new int[]{0, 5, 1, 4}; + case FRONT -> new int[]{0, 3, 1, 2}; + case BACK -> new int[]{0, 2, 1, 3}; + }; + } + + private void readRing(CubeColor[] ring, EdgePosition pos) { + int p = 0; + int[] adj = getAdjacentFaces(pos); + for (int i = 0; i < 3; i++, p++) { + ring[p] = edges[adj[0]].getParts()[i][2]; + } + for (int i = 0; i < 3; i++, p++) { + ring[p] = edges[adj[1]].getParts()[i][0]; + } + for (int i = 0; i < 3; i++, p++) { + ring[p] = edges[adj[2]].getParts()[i][0]; + } + for (int i = 0; i < 3; i++, p++) { + ring[p] = edges[adj[3]].getParts()[i][2]; + } + } + + private void rotateRing(CubeColor[] ring, RotateDirection direction) { + switch (direction) { + case CLOCKWISE -> Collections.rotate(Arrays.asList(ring), 3); + case COUNTERCLOCKWISE -> Collections.rotate(Arrays.asList(ring), -3); + } + } + + private void writeRing(CubeColor[] ring, EdgePosition pos) { + int p = 0; + int[] adj = getAdjacentFaces(pos); + for (int i = 0; i < 3; i++, p++) { + edges[adj[0]].getParts()[i][2] = ring[p]; + } + for (int i = 0; i < 3; i++, p++) { + edges[adj[1]].getParts()[i][0] = ring[p]; + } + for (int i = 0; i < 3; i++, p++) { + edges[adj[2]].getParts()[i][0] = ring[p]; + } + for (int i = 0; i < 3; i++, p++) { + edges[adj[3]].getParts()[i][2] = ring[p]; + } + } + + private void rotateUpRing(RotateDirection direction) { + int n; + if (direction == RotateDirection.CLOCKWISE) { + n = 3; + } else { + n = 1; + } + for (int j = 0; j < n; j++) { + CubeColor[] temp5 = Arrays.copyOf(edges[5].getParts()[0], 3); + edges[5].getParts()[0] = Arrays.copyOf(edges[3].getParts()[0], 3); + edges[3].getParts()[0] = Arrays.copyOf(edges[4].getParts()[0], 3); + edges[4].getParts()[0] = Arrays.copyOf(edges[2].getParts()[0], 3); + edges[2].getParts()[0] = temp5; + } + } + + private void rotateDownRing(RotateDirection direction) { + int n; + if (direction == RotateDirection.CLOCKWISE) { + n = 1; + } else { + n = 3; + } + for (int j = 0; j < n; j++) { + CubeColor[] temp5 = Arrays.copyOf(edges[5].getParts()[2], 3); + edges[5].getParts()[2] = Arrays.copyOf(edges[3].getParts()[2], 3); + edges[3].getParts()[2] = Arrays.copyOf(edges[4].getParts()[2], 3); + edges[4].getParts()[2] = Arrays.copyOf(edges[2].getParts()[2], 3); + edges[2].getParts()[2] = temp5; + } + } + + private void rotateRightRing(RotateDirection direction) { + int n; + if (direction == RotateDirection.CLOCKWISE) { + n = 1; + } else { + n = 3; + } + for (int j = 0; j < n; j++) { + CubeColor[] temp5 = new CubeColor[3]; + for (int i = 0; i < 3; i++) { + temp5[i] = edges[5].getParts()[i][0]; + } + + for (int i = 0; i < 3; i++) { + edges[5].getParts()[i][0] = edges[0].getParts()[i][2]; + } + for (int i = 0; i < 3; i++) { + edges[0].getParts()[i][2] = edges[4].getParts()[2 - i][2]; + } + for (int i = 0; i < 3; i++) { + edges[4].getParts()[i][2] = edges[1].getParts()[i][2]; + } + for (int i = 0; i < 3; i++) { + edges[1].getParts()[i][2] = temp5[2 - i]; + } + } + } + + private void rotateLeftRing(RotateDirection direction) { + int n; + if (direction == RotateDirection.CLOCKWISE) { + n = 1; + } else { + n = 3; + } + for (int j = 0; j < n; j++) { + CubeColor[] temp4 = new CubeColor[3]; + for (int i = 0; i < 3; i++) { + temp4[i] = edges[4].getParts()[i][0]; + } + + for (int i = 0; i < 3; i++) { + edges[4].getParts()[i][0] = edges[0].getParts()[i][0]; + } + for (int i = 0; i < 3; i++) { + edges[0].getParts()[i][0] = edges[5].getParts()[2 - i][2]; + } + for (int i = 0; i < 3; i++) { + edges[5].getParts()[i][2] = edges[1].getParts()[i][0]; + } + for (int i = 0; i < 3; i++) { + edges[1].getParts()[i][0] = temp4[2 - i]; + } + } + } + + private void rotateBackRing(RotateDirection direction) { + int n; + if (direction == RotateDirection.CLOCKWISE) { + n = 1; + } else { + n = 3; + } + for (int j = 0; j < n; j++) { + CubeColor[] temp2 = new CubeColor[3]; + for (int i = 0; i < 3; i++) { + temp2[i] = edges[3].getParts()[i][2]; + } + + for (int i = 0; i < 3; i++) { + edges[3].getParts()[i][2] = edges[1].getParts()[2][2 - i]; + } + for (int i = 0; i < 3; i++) { + edges[1].getParts()[2][i] = edges[2].getParts()[i][0]; + } + for (int i = 0; i < 3; i++) { + edges[2].getParts()[i][0] = edges[0].getParts()[0][2 - i]; + } + for (int i = 0; i < 3; i++) { + edges[0].getParts()[0][i] = temp2[i]; + } + } + } + + private void rotateFrontRing(RotateDirection direction){ + int n; + if (direction == RotateDirection.CLOCKWISE) { + n = 1; + } else { + n = 3; + } + for (int j = 0; j < n; j++) { + CubeColor[] temp3 = new CubeColor[3]; + for (int i = 0; i < 3; i++) { + temp3[i] = edges[3].getParts()[i][0]; + } + + for (int i = 0; i < 3; i++) { + edges[3].getParts()[i][0] = edges[0].getParts()[2][i]; + } + for (int i = 0; i < 3; i++) { + edges[0].getParts()[2][i] = edges[2].getParts()[i][2]; + } + for (int i = 0; i < 3; i++) { + edges[2].getParts()[i][2] = edges[1].getParts()[0][2 - i]; + } + for (int i = 0; i < 3; i++) { + edges[1].getParts()[0][i] = temp3[2 - i]; + } + } + } + + @Override + public void up(RotateDirection direction) { + edges[0].rotate(direction); + rotateUpRing(direction); + } + + @Override + public void down(RotateDirection direction) { + edges[1].rotate(direction); + rotateDownRing(direction); + + } + + @Override + public void left(RotateDirection direction) { + edges[2].rotate(direction); + rotateLeftRing(direction); + } + + @Override + public void right(RotateDirection direction) { + edges[3].rotate(direction); + rotateRightRing(direction); + } + public void front(RotateDirection direction) { + edges[4].rotate(direction); + rotateFrontRing(direction); + } + @Override + public void back(RotateDirection direction) { + edges[5].rotate(direction); + rotateBackRing(direction); } - + public Edge[] getEdges() { return edges; } From 68904415472dcb7b41652560b274596d722521cc Mon Sep 17 00:00:00 2001 From: abeb Date: Mon, 2 Feb 2026 03:24:49 +0300 Subject: [PATCH 02/24] removed the excess --- .../hse/java/practice/task1/RubiksCube.java | 54 ------------------- 1 file changed, 54 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/RubiksCube.java b/src/main/java/hse/java/practice/task1/RubiksCube.java index 5a63ae16..05f9d05b 100644 --- a/src/main/java/hse/java/practice/task1/RubiksCube.java +++ b/src/main/java/hse/java/practice/task1/RubiksCube.java @@ -2,7 +2,6 @@ import java.util.Arrays; -import java.util.Collections; /** * Необходимо реализовать интерфейс Cube @@ -27,59 +26,6 @@ public RubiksCube() { edges[i] = new Edge(colors[i]); } } - - private int[] getAdjacentFaces(EdgePosition pos) { - return switch (pos) { - case UP -> new int[]{4, 2, 5, 3}; - case DOWN -> new int[]{4, 3, 5, 2}; - case LEFT -> new int[]{0, 4, 1, 5}; - case RIGHT -> new int[]{0, 5, 1, 4}; - case FRONT -> new int[]{0, 3, 1, 2}; - case BACK -> new int[]{0, 2, 1, 3}; - }; - } - - private void readRing(CubeColor[] ring, EdgePosition pos) { - int p = 0; - int[] adj = getAdjacentFaces(pos); - for (int i = 0; i < 3; i++, p++) { - ring[p] = edges[adj[0]].getParts()[i][2]; - } - for (int i = 0; i < 3; i++, p++) { - ring[p] = edges[adj[1]].getParts()[i][0]; - } - for (int i = 0; i < 3; i++, p++) { - ring[p] = edges[adj[2]].getParts()[i][0]; - } - for (int i = 0; i < 3; i++, p++) { - ring[p] = edges[adj[3]].getParts()[i][2]; - } - } - - private void rotateRing(CubeColor[] ring, RotateDirection direction) { - switch (direction) { - case CLOCKWISE -> Collections.rotate(Arrays.asList(ring), 3); - case COUNTERCLOCKWISE -> Collections.rotate(Arrays.asList(ring), -3); - } - } - - private void writeRing(CubeColor[] ring, EdgePosition pos) { - int p = 0; - int[] adj = getAdjacentFaces(pos); - for (int i = 0; i < 3; i++, p++) { - edges[adj[0]].getParts()[i][2] = ring[p]; - } - for (int i = 0; i < 3; i++, p++) { - edges[adj[1]].getParts()[i][0] = ring[p]; - } - for (int i = 0; i < 3; i++, p++) { - edges[adj[2]].getParts()[i][0] = ring[p]; - } - for (int i = 0; i < 3; i++, p++) { - edges[adj[3]].getParts()[i][2] = ring[p]; - } - } - private void rotateUpRing(RotateDirection direction) { int n; if (direction == RotateDirection.CLOCKWISE) { From a899d74087c8479c249856a2107e71b673bf7016 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 11 Feb 2026 15:46:41 +0300 Subject: [PATCH 03/24] html lecture3 --- .../lecture3/tasks/html/HtmlDocument.java | 79 ++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/src/main/java/hse/java/lectures/lecture3/tasks/html/HtmlDocument.java b/src/main/java/hse/java/lectures/lecture3/tasks/html/HtmlDocument.java index 1ddf27bf..8888876d 100644 --- a/src/main/java/hse/java/lectures/lecture3/tasks/html/HtmlDocument.java +++ b/src/main/java/hse/java/lectures/lecture3/tasks/html/HtmlDocument.java @@ -27,6 +27,83 @@ private String readFile(Path filePath) { } } - private void validate(String content){} + private void validate(String content) { + Deque deque_part = new ArrayDeque<>(); + int[] used = new int[3]; + Set set = Set.of("html", "head", "body", "div", "p"); + boolean open_head = false; + boolean open_body = false; + for (int i = 0; i < content.length(); i++) { + int flag = 0; + StringBuilder str = new StringBuilder(); + char c = content.charAt(i); + if (c == '<') { + i++; + if (content.charAt(i) == '/') { + i += 1; + flag = 1; + } + c = content.charAt(i); + while (c != '>' && c != ' ') { + str.append(c); + i++; + c = content.charAt(i); + } + if (!set.contains(str.toString().toLowerCase())) { + throw new UnsupportedTagException("Invalid command"); + } + } + if (str.toString().isEmpty() && !set.contains(str.toString())) { + continue; + } + if (str.toString().equalsIgnoreCase("html")) { + if (used[0] >= 2) { + throw new InvalidStructureException("Invalid struct"); + } + used[0] += 1; + } else if (str.toString().equalsIgnoreCase("head")) { + open_head = true; + if(used[0] == 0 || used[2] > 0){ + throw new InvalidStructureException("Invalid struct"); + } + if (used[1] >= 2) { + throw new InvalidStructureException("Invalid struct"); + } + used[1] += 1; + }else if (str.toString().equalsIgnoreCase("body")) { + open_body = true; + if (used[2] >= 2) { + throw new InvalidStructureException("Invalid struct"); + } + used[2] += 1; + } + + if (flag == 0) { + + if (c == ' ') { + while (c != '>') { + i++; + c = content.charAt(i); + } + } + deque_part.offerFirst(str.toString().toLowerCase()); + } else { + if (deque_part.isEmpty()) { + throw new UnexpectedClosingTagException("Unexpected tag"); + } + if (deque_part.getFirst().contentEquals(str.toString().toLowerCase())) { + deque_part.removeFirst(); + } else { + throw new MismatchedClosingTagException("Mismatched tag"); + } + } + if(!open_head && !open_body && !str.toString().equalsIgnoreCase("html")){ + throw new InvalidStructureException("Invalid struct"); + } + } + if (!deque_part.isEmpty()) { + throw new UnclosedTagException("Unclosed tag"); + } + } } From 7dd02907d3ec7461aa0502d46126e0ec830fe8fa Mon Sep 17 00:00:00 2001 From: root Date: Wed, 11 Feb 2026 15:57:51 +0300 Subject: [PATCH 04/24] html: restast tests From 2ff8cb001575eaf59cb45049fc56d62f0e0701ae Mon Sep 17 00:00:00 2001 From: root Date: Sat, 21 Feb 2026 00:35:30 +0300 Subject: [PATCH 05/24] randomset: implement getRandom --- .../practice/randomSet/RandomSet.java | 149 +++++++++++++++++- 1 file changed, 143 insertions(+), 6 deletions(-) diff --git a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java index 8af477b5..063c679e 100644 --- a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java +++ b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java @@ -1,21 +1,158 @@ package hse.java.lectures.lecture3.practice.randomSet; -public class RandomSet { +import java.util.Random; +import java.util.Arrays; + + +public class RandomSet> { + + private static class Node> { + int priority; + V value; + int size = 1; + int index; + Node left = null; + Node right = null; + } + + private final Random rand = new Random(); + + private Node root = null; + + private Object[] randomArray = new Object[1024]; + + private int size = 0; + + private void add_array(T x) { + if (size / 2 > randomArray.length) { + randomArray = Arrays.copyOf(randomArray, randomArray.length * 2); + } + randomArray[size] = x; + } + + private int nodeSize(Node n) { + return n == null ? 0 : n.size; + } + + private Node descent(Node root, T value) { + if (root == null) { + return null; + } + + if (root.value.compareTo(value) > 0) { + return descent(root.left, value); + } + + if (root.value.compareTo(value) < 0) { + return descent(root.right, value); + } + return root; + } + + + + private Node[] split(Node root, T x) { + if (root == null) { + return new Node[]{null, null}; + } else if (x.compareTo(root.value) > 0) { + Node[] res = split(root.right, x); + root.right = res[0]; + root.size = 1 + nodeSize(res[0]) + nodeSize(res[1]); + return new Node[]{root, res[1]}; + } + Node[] res = split(root.left, x); + root.left = res[1]; + root.size = 1 + nodeSize(res[0]) + nodeSize(res[1]); + return new Node[]{res[0], root}; + } + + private Node merge(Node left, Node right) { + if (left == null) { + return right; + } + + if (right == null) { + return left; + } + + if (left.priority > right.priority) { + left.right = merge(left.right, right); + left.size = 1 + nodeSize(left.left) + nodeSize(left.right); + return left; + } + right.left = merge(left, right.left); + right.size = 1 + nodeSize(right.left) + nodeSize(right.right); + return right; + } public boolean insert(T value) { - throw new UnsupportedOperationException("Not implemented"); + if (descent(root, value) != null) { + return false; + } + Node new_node = new Node(); + new_node.value = value; + new_node.priority = rand.nextInt(); + new_node.index = size; + + add_array(value); + size += 1; + + Node[] res = split(root, value); + Node l1 = merge(res[0], new_node); + + root = merge(l1, res[1]); + return true; + } + + private Node removeMin(Node node) { + if (node.left == null) { + return null; + } + node.left = removeMin(node.left); + node.size = 1 + nodeSize(node.left) + nodeSize(node.right); + return node; } public boolean remove(T value) { - throw new UnsupportedOperationException("Not implemented"); + Node target = descent(root, value); + if (target == null) { + return false; + } + + Node[] res = split(root, value); + Node left = res[0]; + Node right = res[1]; + + right = removeMin(right); + + root = merge(left, right); + + + int id_val = target.index; + int id_end = size - 1; + + randomArray[id_val] = randomArray[id_end]; + randomArray[id_end] = null; + + Node end_node = descent(root, (T) randomArray[id_val]); + + end_node.index = id_end; + + size -= 1; + + return true; } + public boolean contains(T value) { - throw new UnsupportedOperationException("Not implemented"); + return descent(root, value) != null; } public T getRandom() { - throw new UnsupportedOperationException("Not implemented"); + if (size == 0) { + throw new EmptySetException("Owch"); + } + int n = rand.nextInt(size); + return (T) randomArray[n]; } - } From dc22aa866736c05e9f85ea90958473d91dfeb5f5 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 21 Feb 2026 00:59:42 +0300 Subject: [PATCH 06/24] =?UTF-8?q?randomset:=20implement=20getRandom=20?= =?UTF-8?q?=E2=84=962?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practice/randomSet/RandomSet.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java index 063c679e..ffd1942e 100644 --- a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java +++ b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java @@ -24,10 +24,11 @@ private static class Node> { private int size = 0; private void add_array(T x) { - if (size / 2 > randomArray.length) { + if (size * 2 > randomArray.length) { randomArray = Arrays.copyOf(randomArray, randomArray.length * 2); } randomArray[size] = x; + size += 1; } private int nodeSize(Node n) { @@ -50,7 +51,6 @@ private Node descent(Node root, T value) { } - private Node[] split(Node root, T x) { if (root == null) { return new Node[]{null, null}; @@ -95,7 +95,6 @@ public boolean insert(T value) { new_node.index = size; add_array(value); - size += 1; Node[] res = split(root, value); Node l1 = merge(res[0], new_node); @@ -124,26 +123,27 @@ public boolean remove(T value) { Node right = res[1]; right = removeMin(right); - root = merge(left, right); - int id_val = target.index; int id_end = size - 1; - randomArray[id_val] = randomArray[id_end]; - randomArray[id_end] = null; - Node end_node = descent(root, (T) randomArray[id_val]); + size -= 1; + if (id_val != id_end) { + randomArray[id_val] = randomArray[id_end]; + Node end_node = descent(root, (T) randomArray[id_val]); + if (end_node != null) { - end_node.index = id_end; + end_node.index = id_end; + } - size -= 1; + } + randomArray[id_end] = null; return true; } - public boolean contains(T value) { return descent(root, value) != null; } From 0fc493bfd198ccacf1ba46aa8509e915d1caad9a Mon Sep 17 00:00:00 2001 From: root Date: Sat, 21 Feb 2026 01:42:14 +0300 Subject: [PATCH 07/24] randomset: implement getRandom 100% final --- .../lectures/lecture3/practice/randomSet/RandomSet.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java index ffd1942e..6b941ce3 100644 --- a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java +++ b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java @@ -105,7 +105,7 @@ public boolean insert(T value) { private Node removeMin(Node node) { if (node.left == null) { - return null; + return node.right; } node.left = removeMin(node.left); node.size = 1 + nodeSize(node.left) + nodeSize(node.right); @@ -133,11 +133,7 @@ public boolean remove(T value) { if (id_val != id_end) { randomArray[id_val] = randomArray[id_end]; Node end_node = descent(root, (T) randomArray[id_val]); - if (end_node != null) { - - end_node.index = id_end; - } - + end_node.index = id_end; } randomArray[id_end] = null; From d144f43a268d661939240c0c7cccc70fc7b31c5a Mon Sep 17 00:00:00 2001 From: root Date: Sat, 21 Feb 2026 01:52:14 +0300 Subject: [PATCH 08/24] randomset: implement getRandom now 100% --- .../lectures/lecture3/practice/randomSet/RandomSet.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java index 6b941ce3..52bbda16 100644 --- a/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java +++ b/src/main/java/hse/java/lectures/lecture3/practice/randomSet/RandomSet.java @@ -1,8 +1,6 @@ package hse.java.lectures.lecture3.practice.randomSet; import java.util.Random; -import java.util.Arrays; - public class RandomSet> { @@ -25,7 +23,10 @@ private static class Node> { private void add_array(T x) { if (size * 2 > randomArray.length) { - randomArray = Arrays.copyOf(randomArray, randomArray.length * 2); + int newLen = randomArray.length * 2; + Object[] newArr = new Object[newLen]; + System.arraycopy(randomArray, 0, newArr, 0, randomArray.length); + randomArray = newArr; } randomArray[size] = x; size += 1; @@ -133,7 +134,7 @@ public boolean remove(T value) { if (id_val != id_end) { randomArray[id_val] = randomArray[id_end]; Node end_node = descent(root, (T) randomArray[id_val]); - end_node.index = id_end; + end_node.index = id_val; } randomArray[id_end] = null; From 63d70f4f735a1ec46be8ff3558023f41148444c8 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 6 Mar 2026 04:21:11 +0300 Subject: [PATCH 09/24] commander: all okk --- .../hse/java/commander/MainController.java | 226 +++++++++++++++--- .../hse/java/commander/commander-ui.fxml | 14 +- 2 files changed, 211 insertions(+), 29 deletions(-) diff --git a/commander/src/main/java/hse/java/commander/MainController.java b/commander/src/main/java/hse/java/commander/MainController.java index 95d2eda9..e239e5d8 100644 --- a/commander/src/main/java/hse/java/commander/MainController.java +++ b/commander/src/main/java/hse/java/commander/MainController.java @@ -1,27 +1,199 @@ -package hse.java.commander; - -import javafx.fxml.FXML; -import javafx.scene.control.ListView; - -public class MainController { - - public void initialize() { - left.getItems().add("Kek"); - left.setOnMouseClicked(event -> { - if (event.getClickCount() == 2) { - int index = left.getSelectionModel().getSelectedIndex(); - if (index >= 0) { - left.getItems().set(index, "clicked"); - } - } - }); - } - - @FXML - public ListView left; - - @FXML - public ListView right; - - -} +package hse.java.commander; + +import java.io.IOException; +import java.nio.file.*; +import java.util.Comparator; +import java.util.List; +import java.util.function.BiFunction; +import java.util.function.IntBinaryOperator; +import java.util.stream.Stream; + +import javafx.collections.ObservableList; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.control.SelectionMode; +import javafx.scene.layout.AnchorPane; + +public class MainController { + + boolean focused = false; + + Path leftDir = Path.of("C:\\Users\\basko\\Desktop\\testDirLeft"); + Path rightDir = Path.of("C:\\Users\\basko\\Desktop\\testDirRight"); + + AnchorPane pane = new AnchorPane(); + Label viewPathLeft = new Label(""); + Label viewPathRight = new Label(""); + + @FXML + public ListView left; + + @FXML + public ListView right; + + private void updateView(ListView target, Path dir) { + target.getItems().clear(); + Path parentDir = dir.getParent(); + target.getItems().add(parentDir); + + try (Stream paths = Files.list(dir)) { + paths.forEach(path -> target.getItems().add(path)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void customList(ListView target, Path dir) { + target.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); + + target.setCellFactory(p -> new ListCell() { + @Override + protected void updateItem(Path path, boolean empty) { + super.updateItem(path, empty); + + if (empty || path == null) { + setText(null); + setGraphic(null); + return; + } + + Path currentDir = (target == left) ? leftDir : rightDir; + + Path parent = currentDir == null ? null : currentDir.getParent(); + + if (path.equals(parent)) { + setText("..."); + } else { + setText(path.getFileName().toString()); + } + + } + }); + } + + private void setCustomClick(ListView left1, ListView right1, boolean chanceFocus) { + left1.setOnMouseClicked(event -> { + right1.getSelectionModel().clearSelection(); + focused = chanceFocus; + if (event.getClickCount() == 2) { + int index = left1.getSelectionModel().getSelectedIndex(); + if (index >= 0 && Files.isDirectory(left1.getItems().get(index))) { + if (!chanceFocus) { + leftDir = left1.getItems().get(index); + } else { + rightDir = right.getItems().get(index); + } + left1.getItems().clear(); + updateView(left1, !chanceFocus ? leftDir : rightDir); + } + } + }); + } + + public void initialize() { + updateView(left, leftDir); + updateView(right, rightDir); + + customList(left, leftDir); + customList(right, rightDir); + + setCustomClick(left, right, false); + setCustomClick(right, left, true); + } + + private void clearSelect() { + left.getSelectionModel().clearSelection(); + right.getSelectionModel().clearSelection(); + } + + public void handleMove(ActionEvent actionEvent) { + System.out.println(focused); + + ListView nowSelected = !focused ? left : right; + ListView target = focused ? left : right; + Path targetDir = focused ? leftDir : rightDir; + + ObservableList selectionItem = nowSelected.getSelectionModel().getSelectedItems(); + + for (Path sourcePath : List.copyOf(selectionItem)) + try { + System.out.println("Перемещение: " + sourcePath + " : " + sourcePath.getFileName()); + Files.move(sourcePath, targetDir.resolve(sourcePath.getFileName())); +// target.getItems().add(targetDir.resolve(sourcePath.getFileName())); +// nowSelected.getItems().remove(sourcePath); + } catch (IOException e) { + System.err.println("Ошибка перемещения"); + e.printStackTrace(); + + } + updateView(left, leftDir); + updateView(right, rightDir); + clearSelect(); + } + + public void handleCopy(ActionEvent actionEvent) { + ListView nowSelected = !focused ? left : right; + ListView target = focused ? left : right; + Path targetDir = focused ? leftDir : rightDir; + + ObservableList selectionItem = nowSelected.getSelectionModel().getSelectedItems(); + + for (Path sourcePath : List.copyOf(selectionItem)) { + try (Stream currentPath = Files.walk(sourcePath)) { + currentPath.forEach(source -> { + try { + Path relativePath = sourcePath.relativize(source); + Path newPath = targetDir.resolve(sourcePath.getFileName()).resolve(relativePath); + if (Files.isDirectory(source)) { + Files.createDirectories(newPath); + } else { + Files.copy(source, newPath); + } + if (newPath.getParent().equals(targetDir)) { +// target.getItems().add(newPath); + } + } catch (IOException e) { + System.err.println("Ошибка копирования: " + source); + e.printStackTrace(); + } + }); + } catch (IOException e) { + System.err.println("Ошибка рекурсивного копирования!"); + } + } + updateView(left, leftDir); + updateView(right, rightDir); + clearSelect(); + } + + public void handleDelete(ActionEvent actionEvent) { + ListView nowSelected = !focused ? left : right; + Path targetDir = !focused ? leftDir : rightDir; + + ObservableList selectionItem = nowSelected.getSelectionModel().getSelectedItems(); + + for (Path sourcePath : List.copyOf(selectionItem)) { + try (Stream currentPath = Files.walk(sourcePath).sorted(Comparator.reverseOrder())) { + currentPath.forEach(source -> { + try { + Files.delete(source); + if (source.getParent().equals(targetDir)) { +// nowSelected.getItems().remove(source); + } + } catch (IOException e) { + System.err.println("Ошибка копирования: " + source); + e.printStackTrace(); + } + }); + } catch (IOException e) { + System.err.println("Ошибка рекурсивного копирования!"); + } + } + updateView(left, leftDir); + updateView(right, rightDir); + clearSelect(); + } +} diff --git a/commander/src/main/resources/hse/java/commander/commander-ui.fxml b/commander/src/main/resources/hse/java/commander/commander-ui.fxml index e9d56999..5ea009bc 100644 --- a/commander/src/main/resources/hse/java/commander/commander-ui.fxml +++ b/commander/src/main/resources/hse/java/commander/commander-ui.fxml @@ -1,14 +1,24 @@ + - + + + +