Graphs are a collection of nodes connected by edges. Programmers run into graphs fairly regularly because almost any collection of things with binary relationships can be viewed as a graph. As practitioners we need to understand both graph theory (abstract structures) and graph data structures (concrete representations).
Three common families of graphs are:
This article looks at digraphs, dags, and trees from a programmer’s perspective. Where do we see them in practice? How can we recognize them? What can we do with them?
This article also includes a Java library for working with digraphs, dags, and trees. The library code is available at https://github.com/stevewedig/blog and is published to Maven for easy usage as a dependency. This is the third in a series of Java libraries I’m sharing on this blog. The first two were:
- Digraphs (directed graphs)
- Dags (directed-acyclic graphs)
- A Java library for digraphs, dags, and trees
- Other Java graph libraries
As someone who has shifted from Python to Java, this article discusses two of the problems I’ve faced in Java that don’t exist in Python:
- Java’s type system cannot represent containers or maps with heterogenous value types. Python dicts can hold anything.
- Java’s methods lack named and optional parameters. These useful language features are provided by Python, Ruby, and C#.
As a response to these problems, this article presents a small library that makes them a bit less painful. We build on Effective Java’s item #29: consider typesafe heterogeneous containers. The library code is available at https://github.com/stevewedig/blog and is published to Maven for easy usage as a dependency. This is the second in a series of Java libraries I’m sharing on this blog (the first was Value Objects in Java & Python).
- Two problems with Java
- Get and cast: Heterogenous maps without type safety
- TypeMap: Effective Java’s type safe heterogenous map
- Symbol: A key with a value type parameter
- SymbolMap: An improved type safe heterogenous map
- SymbolBus: Heterogeneous event publishing/subscribing
- Using SymbolMap for named and optional parameters
- SymbolFormat: Parsing & writing SymbolMaps
- SymbolSchema: Validating the symbols in SymbolMaps
(Edit: This is a fairly old library. If you are interested in @once, frozendict, and Opt, these are included as part of the newer value objects library.)
A while ago I gave a talk to the LA Python user group about a few Python tricks we use at my company Lingospot. Three years later we’re still using all of these techniques. There isn’t any particular theme, it’s just a mix of tricks that are simple and widely applicable. You can find the slides and sample code here.
If I recall, the talk was generally well received. Interestingly some audience members didn’t find Option Types to be “Pythonic”, which very well may be true. Nowadays I prefer to use Java for reasons I describe in Why & How I Write Java. For Option Types in Java I use Google Guava’s Optional. I certainly don’t miss the errors caused by null/None.