15 Commits

Author SHA1 Message Date
3c3d418aa2 v1.2.2 2020-01-21 15:11:32 +01:00
f00ab975dc Fixed tree initialization in Kotlin 2020-01-21 15:11:04 +01:00
eb2d5f07be Extracted prettyString from toString() method to new method prettyString() 2020-01-20 15:42:15 +01:00
3f166aced0 Renamed functions. 2020-01-19 22:55:32 +01:00
8dbbd3b2f8 Update _config.yml 2020-01-17 22:51:13 +01:00
f8206013c2 Update _config.yml 2020-01-17 22:50:46 +01:00
cf3e5e2c6a Update _config.yml 2020-01-17 22:49:42 +01:00
5cdf1a9cbc Update _config.yml 2020-01-17 22:48:19 +01:00
c30d516bd2 Set theme jekyll-theme-minimal 2020-01-16 15:08:45 +01:00
dc0317daba Delete CNAME 2020-01-12 23:11:27 +01:00
9834cbf07c Create CNAME 2020-01-12 23:11:01 +01:00
1b08504ab9 Set theme jekyll-theme-slate 2020-01-12 20:40:50 +01:00
d49d813ab5 Update README.md 2020-01-12 16:30:22 +01:00
5dd80035e4 Update README.md 2020-01-11 18:52:42 +01:00
3e5401bd9d Updated README 2020-01-11 00:55:15 +01:00
7 changed files with 111 additions and 49 deletions

View File

@ -1,47 +1,73 @@
# Tree (Data Structure)
[![maven](https://img.shields.io/maven-central/v/com.github.adriankuta/tree-structure?style=plastic)](https://search.maven.org/artifact/com.github.adriankuta/tree-structure)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue?style=plastic)](https://github.com/AdrianKuta/Design-Patterns-Kotlin/blob/master/LICENSE)
[![CircleCI](https://img.shields.io/circleci/build/github/AdrianKuta/Tree-Data-Structure/master?label=CircleCI&style=plastic)](https://circleci.com/gh/AdrianKuta/Tree-Data-Structure)
[![maven](https://img.shields.io/maven-central/v/com.github.adriankuta/tree-structure?style=plastic)](https://mvnrepository.com/artifact/com.github.adriankuta/tree-structure)
[![License: MIT](https://img.shields.io/github/license/AdrianKuta/Tree-Data-Structure?style=plastic)](https://github.com/AdrianKuta/Design-Patterns-Kotlin/blob/master/LICENSE)
[![CircleCI](https://img.shields.io/circleci/build/github/AdrianKuta/Tree-Data-Structure/master?label=CircleCI&style=plastic&logo=circleci)](https://circleci.com/gh/AdrianKuta/Tree-Data-Structure)
Simple implementation to store object in tree structure. Method `toString()` is overrided to provide nice tree view in logs.
## Usage
**Kotlin**
```kotlin
val root = TreeNode<String>("Root")
val beveragesNode = TreeNode<String>("Beverages")
val curdNode = TreeNode<String>("Curd")
root.addChild(beveragesNode)
root.addChild(curdNode)
val root = TreeNode("World")
val northA = TreeNode("North America")
val europe = TreeNode("Europe")
root.addChild(northA)
root.addChild(europe)
val teaNode = TreeNode<String>("tea")
val coffeeNode = TreeNode<String>("coffee")
val milkShakeNode = TreeNode<String>("Milk Shake")
beveragesNode.addChild(teaNode)
beveragesNode.addChild(coffeeNode)
beveragesNode.addChild(milkShakeNode)
val usa = TreeNode("USA")
northA.addChild(usa)
val gingerTeaNode = TreeNode<String>("ginger tea")
val normalTeaNode = TreeNode<String>("normal tea")
teaNode.addChild(gingerTeaNode)
teaNode.addChild(normalTeaNode)
val poland = TreeNode("Poland")
val france = TreeNode("France")
europe.addChild(poland)
europe.addChild(france)
println(root.prettyString())
```
val yogurtNode = TreeNode<String>("yogurt")
val lassiNode = TreeNode<String>("lassi")
curdNode.addChild(yogurtNode)
curdNode.addChild(lassiNode)
**Pretty Kotlin**
println(root)
System.out.println("Remove: ${curdNode.value}")
root.removeChild(curdNode)
System.out.println("Remove: ${gingerTeaNode.value}")
root.removeChild(gingerTeaNode)
println(root)
```kotlin
val root =
tree("World") {
child("North America") {
child("USA")
}
child("Europe") {
child("Poland")
child("Germany")
}
}
```
**Java**
```java
TreeNode<String> root = new TreeNode<>("World");
TreeNode<String> northA = new TreeNode<>("North America");
TreeNode<String> europe = new TreeNode<>("Europe");
root.addChild(northA);
root.addChild(europe);
TreeNode<String> usa = new TreeNode<>("USA");
northA.addChild(usa);
TreeNode<String> poland = new TreeNode<>("Poland");
TreeNode<String> france = new TreeNode<>("France");
europe.addChild(poland);
europe.addChild(france);
System.out.println(root.prettyString());
```
*Output:*
<img src="https://github.com/AdrianKuta/Tree-Collection/blob/master/images/console_output.png" width=400>
```
World
├── North America
│ └── USA
└── Europe
├── Poland
└── France
```
## Download

3
_config.yml Normal file
View File

@ -0,0 +1,3 @@
theme: jekyll-theme-minimal
title: Tree Data Structure
logo: images/console_output.png

View File

@ -15,7 +15,7 @@ android {
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.1.0"
versionName "1.2.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'

View File

@ -5,17 +5,17 @@ interface ChildDeclarationInterface<T> {
/**
* This method is used to easily create child in node.
* ```
* val root = treeNode("World") {
* treeNode("North America") {
* treeNode("USA")
* val root = tree("World") {
* child("North America") {
* child("USA")
* }
* treeNode("Europe") {
* treeNode("Poland")
* treeNode("Germany")
* child("Europe") {
* child("Poland")
* child("Germany")
* }
* }
* ```
*/
@JvmSynthetic
fun treeNode(value: T, childDeclaration: ChildDeclaration<T>? = null)
fun child(value: T, childDeclaration: ChildDeclaration<T>? = null)
}

View File

@ -27,7 +27,7 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn
}
@JvmSynthetic
override fun treeNode(value: T, childDeclaration: ChildDeclaration<T>?) {
override fun child(value: T, childDeclaration: ChildDeclaration<T>?) {
val newChild = TreeNode(value)
if(childDeclaration != null)
newChild.childDeclaration()
@ -91,6 +91,10 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn
}
override fun toString(): String {
return value.toString()
}
fun prettyString(): String {
val stringBuilder = StringBuilder()
print(stringBuilder, "", "")
return stringBuilder.toString()

View File

@ -5,13 +5,14 @@ typealias ChildDeclaration<T> = ChildDeclarationInterface<T>.() -> Unit
/**
* This method can be used to initialize new tree.
* ```
* val root = treeNode("World") { ... }
* val root = tree("World") { ... }
* ```
* @see [ChildDeclarationInterface.treeNode]
* @param root Root element of new tree.
* @see [ChildDeclarationInterface.child]
*/
@JvmSynthetic
inline fun<reified T> treeNode(value: T, childDeclaration: ChildDeclaration<T>): TreeNode<T> {
val treeNode = TreeNode(value)
inline fun<reified T> tree(root: T, childDeclaration: ChildDeclaration<T>): TreeNode<T> {
val treeNode = TreeNode(root)
treeNode.childDeclaration()
return treeNode
}

View File

@ -114,17 +114,45 @@ class TreeNodeTest {
@Test
fun kotlinExtTest() {
val root = treeNode("World") {
treeNode("North America") {
treeNode("USA")
val root = TreeNode("World")
val northA = TreeNode("North America")
val europe = TreeNode("Europe")
root.addChild(northA)
root.addChild(europe)
val usa = TreeNode("USA")
northA.addChild(usa)
val poland = TreeNode("Poland")
val france = TreeNode("France")
europe.addChild(poland)
europe.addChild(france)
val rootExt = tree("World") {
child("North America") {
child("USA")
}
treeNode("Europe") {
treeNode("Poland")
treeNode("Germany")
child("Europe") {
child("Poland")
child("France")
}
}
println(root)
assertEquals(root.prettyString(), rootExt.prettyString())
}
// @Test
// fun getVisibleNodes() {
// val root = tree("World") {
// child("Level 1") {
// child("Level 2") {
// child("Level 3") {
// child("Level 4")
// }
// }
// }
// }
//
// print(root.prettyString())
// }
}