Comparator interface – how to sort it all (out)?

Hi!

In this post I would like to show you a simple way for sorting list of objects in the specified order using Comparator interface.

Sorting ArrayList of Integers

Sorting ArrayLists is quick and easy, as long as they store only numbers. Let us have some ArrayList of Integers:

ArrayList arrayListOfNumbers = new ArrayList<>();
for(int i=0; i<10;i++)
{
arrayListOfNumbers.add(new Random().nextInt(100));
}

with some random numbers:
[74, 71, 79, 14, 94, 95, 21, 87, 83, 0]

To sort it, we only need to use sort method:

 Collections.sort(arrayListOfNumbers);

And then we have our numbers sorted in ascending order:
[0, 14, 21, 71, 74, 79, 83, 87, 94, 95]

Then we can use reverse:

 Collections.reverse(arrayListOfNumbers);

to have them sorted in descending order:
[95, 94, 87, 83, 79, 74, 71, 21, 14, 0]

You can use Collections.sort() and reverse() to manage ArrayList of String as well.

Sorting ArrayList of Objects

But we don’t use ArrayList only for storing numbers or text, right? We usually use them to store our objects. How to handle sorting then?

Suppose we have an ArrayList containing actresses:

ArrayList arrayListOfActress = new ArrayList<>();


public class Actress {

 private String name; 
 private String surname; 

 public Actress(String name, String surname) 
 { this.name = name; this.surname = surname; } 

 public String getFirstName() { return name; } 
 public void setFirstName(String firstName) { this.name = firstName; } 
 public String getSurname() { return surname; } 
 public void setSurname(String surname) { this.surname = surname; } 

 @Override public String toString() { return name + " " + surname; }

}

that after adding some actresses looks like this:

ArrayList with some actresses: 
[Julia Roberts, Amy Adams, Meryl Streep, Nicole Kidman, Emma Stone, Jennifer Aniston]

When we try to use Collections.sort() operation, compilator would throw an error:

The method sort(List) in the type Collections is not applicable for the arguments (ArrayList)

What happened here?

Collections.sort() had no problems with lists containing numbers or texts. So why does not work for list of Actress?

The reason for this, is that Actress object is not built-in Java class like Integer or String, so compilator doesn’t know how to compare them. What does it mean to have Actress objects sorted anyway? Should they be sorted in alphabetical order by name or surname? Which class fields should be taken into account?

Collections.sort() worked for numbers and texts, because both Integer and String implement Comparable interface. Implementation of Comparable provides natural ordering for sorting, which is signed numerical for Integer and lexicographic for String. In case of Actress objects we need to specify the exact way how they should be compared. We can achieve this by implementing Comparator interface.

Interface Comparator

Comparator interface has only one method:

public interface Comparator {
   int compare(T o1, T o2);
}

Its return value provides the result of comparing two objects o1 and o2:

Zero            when o1 == o2
Positive number when o1 >  o2
Negative number when o1 <  o2

Below you can see simple ActressComparator, that sorts actresses in alphabetical order by their surnames:

import java.util.Comparator;

public class ActressComparator implements Comparator {

 @Override 
 public int compare(Actress a, Actress b) 
 { 
   return a.getSurname().compareToIgnoreCase(b.getSurname()); 
 }

}

We use it as the argument for sort() method:

arrayListOfActress.sort(new ActressComparator());

And in effect our list of object is sorted!

Actresses sorted by surname: 
[Amy Adams, Jennifer Aniston, Nicole Kidman, Julia Roberts, Emma Stone, Meryl Streep]

Of course it’s only a start for comparing more complex objects in a more sophisticated way than sorting actresses by their surnames 🙂

Advertisements

The power of Lombok

Hi!

Today I would like to introduce you to Lombok – a very useful tool for Java coders.

What is Lombok?

Shortly speaking, it’s a library that reduces the amount of boilerplate code in your Java projects. Let me show you some Lombok power using example with simple Employee class. Employee has three fields along with corresponding getters/setters.

public class Employee { 

private String name; 
private String surname; 
private int age; 

public String getName() { return name; } 
public void setName(String name) { this.name = name; } 
public String getSurname() { return surname; } 
public void setSurname(String surname) { this.surname = surname; } 
public int getAge() { return age; } 
public void setAge(int age) { this.age = age; } 
}

Now see what happens when you are using Lombok:

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class EmployeeWithLombok {

private String name; 
private String surname; 
private int age; 
}

Yes, this code above is sufficient – you only need two Lombok annotations to have all your getters and setters available.

And I have once thought that have your getters/setters generated by Eclipse is a cool thing 😉

What else can Lombok do for you?

Generates your setters/getters:
@Getter/@Setter

Generates implementation of Object methods:
@ToString
@EqualsAndHashCode

Generates your constructors in different variants:
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor

Generates a builder for your objects:
@Builder

You can find some more at Lombok site: https://projectlombok.org/features/all 

And how to get it

Now I will show how to get Lombok running in your Eclipse:

  1. Go to https://projectlombok.org/download and get newest lombok
  2. Go to Windows cmd and find directory where you download lombok.jar
  3. Type: java – jar lombok.jar. The Lombok window should appear:lombok_installing
  4. Click on Specify location..  and find directory with your Eclipse.inilombok_installing_find_eclipse_ini
  5. . Then click on Install/Update and have your Lombok installedlombok_installing_successfull
  6. . Restart yout Eclipse (if needed)
  7.  Add Lombok dependency to your Maven pom.xml
     <dependencies>
           <dependency>
                 <groupId>org.projectlombok</groupId>
                 <artifactId>lombok</artifactId>
                 <version>1.16.16</version>
                 <scope>provided</scope>
           </dependency>
    </dependencies>
  8. Click on Project -> Maven -> Update Project
  9. Enjoy Lombok power! 🙂

The simplest way to set up your first project for Spring web app

Hi!

Have you ever felt frustrated when trying to configure your first Spring project? You want to start developing web apps with Spring MVC but managing all Maven depencies is slowing you down? Not to mention that you’ll soon need a server to get your app running..

I have also spent some long hours, struggling to set up my Spring project workspace along with Tomcat server. And then, during the traing I have attended, I have learnt about SpringBoot and Spring Initializr that makes the whole process easier.

Below you’ll find step by step guide showing how to create your first SpringBoot project using Spring Initializr.

  1. Go to https://start.spring.io/1. Go to Spring Initializr
  2. Choose Maven or Gradle Project
  3. Choose language
  4. Type your application name
  5. Search for needed dependencies (or click on Switch to the full version to see all the details)
  6. When you’re ready, click on generate project2. Generate your projectAs you can see I’ve chosen Web dependency as we want to start a web app. According to Spring Initializr choosing Web dependency gives us “Full-stack web development with Tomcat and Spring MVC”
  7. Now unpack zip folder in your workspace
  8. Import project to your workspace in Eclipse (File -> Import, then choose Existing Maven project)3. Import Existing Maven Project
  9. Browse directory for your project4. Browse for your project
  10. Check Add project to working set and click on Finish5. Finish importing
  11. Wait till workspace is built… and your project is now ready!6. Imported project is ready to useAlong with POM file:7. Pom is generated

I hope Spring Initializr will also save some of your time in future 🙂

 

Daj się poznać 2017 – podsumowanie konkursu / Get Noticed 2017 – contest summary

For English please scroll down

Cześć!

11 tygodni temu wystartowałam z realizacją własnego projektu programistycznego oraz założyłam bloga na konkurs “Daj się poznać 2017”. Jako, że maj powoli dobiega końca przyszedł czas na małe podsumowanie moich zmagań.

Projekt CarDealer

Pozwolę sobie krótko przypomnieć, dlaczego zdecydowałam się na taki, a nie inny projekt. Otóż moim głównym celem było zrealizowanie prostej, ale kompletnej aplikacji webowej łączącej się bazą danych i sterowalnej z poziomu przeglądarki internetowej. Nie liczył się oryginalny pomysł ani rozbudowana funkcjonalność – liczyło się praktyczne wykorzystanie we własnym projekcie technologii, w których chcę się rozwijać (więcej o założeniach projektu znajdziesz w CarDealer #1). Z przyjemnością mogę powiedzieć, że w ramach czasu konkursowego udało mi się ten cel zrealizować 🙂

Etapy realizacji projektu

  1.  Założenie tabeli cars w bazie danych i implementacja klasy Car (CarDealer#2)
  2. Połączenie się z bazą danych przy użyciu JDBC (CarDealer#3)
  3. Import danych z pliku CSV do kolekcji obiektów (CarDealer#4)  i ich zapis do bazy danych (CarDealer #5) – na razie niedostępne z poziomu przeglądarki
  4. Rozszerzenie tabeli i klasy o nowe atrybuty samochodów (CarDealer #6)
  5. Dodanie kontrolerów i widoków (CarDealer #7)
  6. Uruchomienie aplikacji webowej – konfiguracja Spring MVC i JDBC Template  (CarDealer #8CarDealer #9)
  7. Udostępnienie metod CRUD z poziomu przeglądarki (CarDealer #10)
  8. Logowanie dla użytkowników admin i dealer, czyli Spring Security (CarDealer #11)
  9. Ulepszanie wyglądu aplikacji (CarDealer #12CarDealer #13)
  10. Dodanie walidacji formularzy (CarDealer #14)

Pełny kod znajdziecie na moim GitHubie.

Technologie i narzędzia użyte projekcie

Baza danych: PostgreSQL

IDE:  Eclipse Luna

Serwer: Tomcat 8.0

Backend: Java, Maven, Spring (MVC, JDBC, Security)

Frontend: HTML, CSS, Bootstrap

Repozytorium: GIT, GitHub

Podsumowanie projektu

Jako że moje wcześniejsze doświadczenia z programowaniem opierały się głównie na działaniach w części serwerowej, cieszę się, że w ramach konkursu zrealizowałam kompletną aplikację we wzorcu MVC wykorzystując framework Spring. Praca nad projektem pozwoliła mi postawić pierwsze kroki w konfiguracji XML dla Spring MVC i Spring Security. Jestem też zadowolona, że udało mi się wzbogacić proste widoki HTML dodatkowo o szablon CSS i framework Bootstrap. Moim minimalnym wymaganiem była możliwość manipulowania danymi z bazy danych z poziomu przeglądarki – ale cieszy mnie, że główny widok aplikacji nie przypomina już tabelki z Excela 😉

Szkoda, że nie udało mi się w czasie konkursowym udostępnić funkcji importu z pliku CSV w widoku aplikacji – nadrobię to w kolejnych tygodniach łącznie z funkcją eksportu do pliku. Przydałby się też moduł rejestracji nowych użytkowników – w tej wersji aplikacji możemy się zalogować tylko jako dealer lub admin. Nie powstał, wspominany w celach projektu, moduł do wyszukiwania samochodów wedle zadanych kryteriów – to również wrzucam na listę do zrealizowania w kolejnych etapach.

Blog

W czasie konkursu na blogu powstały (łącznie z tym) 23 wpisy. Każdy wpis opublikowany został w dwóch wersjach językowych: polskiej i angielskiej. Poniżej lista postów niezwiązanych z projektem:

Wpisy na tematy IT:

Wpisy skierowane dla osób rozpoczynających swoją przygodę z Javą i Eclipsem:

Największą frajdę sprawiło mi tworzenie postów / mini-artykułów o tematyce IT, mimo że wymagało to poświęcenia pewnej ilości czasu na zapoznanie się z danym tematem. Mam nadzieję, że poruszane tematy choć odrobinę Was zaciekawiły 🙂

Co dalej?

Chcę nadal rozwijać aplikację CarDealer. Po 11 tygodniach konkursu mam przygotowaną bazę do dalszej pracy. Chcę teraz skoncentrować się na części serwerowej – przez ostatnie tygodnie dostosowywania widoków nauczyłam się sporo nowych rzeczy, ale jednak oddaliłam się trochę od Javy. Mam nadzieję, że teraz, gdy mam gotową bazę, będzie mi łatwiej dalej regularnie pracować nad aplikacją 🙂

Jeśli chodzi o bloga, to definitywnie nie znika on z sieci wraz z zakończeniem konkursu. Zapiski programistki będą czekać na Twoje odwiedziny z nowym postem publikowanym raz na tydzień! 🙂

***

Hi!

11 weeks ago I have started implementation of my own programming project and this blog for the “Get Noticed 2017” contest. May is nearly over, so i’s time for some summary of my work.

The CarDealer project

Let me remind you why I have decided for this type of project. My main goal has been to implement a simple, but complete web application connected to data base and manipulated from web browser level. The idea or complex functionality was less important. What counted more for me, was practical use of technologies (in which I want to develop) in my own project. More about project aims you’ll find in CarDealer #1. I have now the pleasure to say: I have managed to achieve my goal in the contest’s time 🙂

Project’s steps

  1.  Creating cars table in data base and Car class implementation (CarDealer#2)
  2. Connecting to DB using JDBC (CarDealer#3)
  3. Import data from CSV file to objects collection (CarDealer#4)  and saving them in DB (CarDealer #5) – not available from browser level yet
  4. Extending table and class with new car attributes (CarDealer #6)
  5. Adding controllers and views (CarDealer #7)
  6. Launching web application – configurating Spring MVC and JDBC Template  (CarDealer #8CarDealer #9)
  7. CRUD methods avaliable from browser (CarDealer #10)
  8. Login module for users:admin and dealer with Spring Security (CarDealer #11)
  9. Enhancing app view (CarDealer #12CarDealer #13)
  10. Form validation (CarDealer #14)

You will find the whole code on my GitHub.

Technologies and tools used in project

DB: PostgreSQL

IDE:  Eclipse Luna

Server: Tomcat 8.0

Backend: Java, Maven, Spring (MVC, JDBC, Security)

Frontend: HTML, CSS, Bootstrap

Repository: GIT, GitHub

Project’s summary

As my previous experience with programming were based mainly on the server-side, I am glad that during contest I have implemented the complete web app in MVC using Spring framework. Working on project has let me take the first steps in XML configuration for Spring MVC and Spring Security. I am also glad, that I have managed to enhance simple HTML views with some CSS and Bootstrap framework. My mininal requirement was to enable manipulating data from DB from the browser level – but I am thrilled that main app view no longer looks like Excel table 😉

It’s a pity that in the contest time I haven’t managed to add option for importing data from CSV file to the app view – I am going to make it up in the following weeks, as well as implementing the option for exporting data to CSV file. It would be nice to have a module for registering new users – in this app version you can only sign in as a dealer or an admin. There is no, though mentioned in project’s aims, module for searching for cars with given criteria – this also goes for my todo-list.

Blog

In the contest’s time I have published 23 posts (including this one). Every post was published in two languages: polish and english. Below you can see list of posts, that didn’t concern CarDealer project:

Posts about IT:

Posts with tips for beginners in Java and Eclipse:

Creating posts / mini-articles concerning IT was the biggest fun for me, although it required some time spent on research of given subject. I hope, you have found them a little bit interesting 🙂

What’s next?

I want to develop further my CarDealer application. After 11 weeks of contest I have got the prepared base for further work. I want to focus on the server-side now – during previous weeks while adjusting views I have learnt a lot of new stuff, but I have left Java behind. I hope, now, when the base is ready, it will be easier for me to work regularly on the app 🙂

If it comes for the blog, it would definately not disappear from the web when the contest is over. The Programmer’s notes (Zapiski programistki) would wait for your visit with fresh post published once a week! 🙂

CarDealer #14 – walidacja formularzy / form validation

For English please scroll down and click Continue reading

Cześć!

W tym tygodniu dalsze prace przy widokach aplikacji.

Dla formularzy dodawania i edycji auta dla części pól wejściowych zmieniłam sposób wprowadzania danych. Teraz dla pól: rok, typ paliwa, skrzynia biegów i kolor, zamiast wpisywać dowolną wartość, użytkownik wybiera jedną z dostępnych opcji z listy.

Dodałam też podstawową walidację formularzy, aby uniknąć błędów przy zapisie do bazy danych, czyli m.in. ograniczyłam pole przebiegu w kilometrach do 6 cyfr.

Ponadto ustawiłam pola “marka” i “model” auta jako obowiązkowe. Nie można dokonać zapisu auta, gdy te dwa pola są puste.

Dzięki zastosowaniu frameworka Bootstrap komunikaty ostrzeżeń wyświetlają się automatycznie, kiedy ktoś wpisze wartość w niedozwolonym formacie. Ja tylko dodałam odpowiednie warunki w kodzie. Na przykład dla przebiegu auta określiłam, że dozwolone są jedynie liczby z przedziału [0,  999999]:

<input type="number" class="form-control" 
name="kilometer" min="0" max="999999">

Poniżej przykładowe screeny z aplikacji, a pełny kod jak zawsze na moim githubie.

walidacja required
Pole “make” jako obowiązkowe / Field “make” set as required
edit select
Wybierz rodzaj paliwa / Select type of fuel
walidacja engine
Pojemność silnika tylko w formacie 0.0 / Engine only in 0.0 format
walidacja kilometer
Przebieg w kilometrach tylko 6 cyfr / Kilometer range only on 6 digits

Continue reading “CarDealer #14 – walidacja formularzy / form validation”

IoT – czy naprawdę wszystko potrzebuje internetu? / IoT- does it all really need internet?

Jednym z trendów, który zyskuje coraz większą popularność jest IoT – Internet of Things, czy używając polskiego odpowiednika – Internet Rzeczy. Dziś chcę się skoncentrować na jego marketingowej odsłonie, czyli na masowym dodawaniu modułów WiFi czy Bluetooth do wszelkiego rodzaju urządzeń AGD i RTV. Do naprawdę wszelkiego rodzaju urządzeń – Smart TV to przy tym pestka.

***

One of trends of growing popularity is IoT – Internet of Things. Today, I would like to focus on its marketing angle – mass equipping to any  types of devices with Wi-Fi or Bluetooth modules. Literally, any types of devices. Comparing to them – Smart TV is piece of cake.

Continue reading “IoT – czy naprawdę wszystko potrzebuje internetu? / IoT- does it all really need internet?”

CarDealer #13 – optymalizacja wyglądu aplikacji / enhancing the app’s view

Tydzień upłynął mi na ulepszaniu wyglądu aplikacji. Oto jak teraz wygląda CarDealer 🙂

The last few days I have spent adjusting views of my application  Here is how CarDealer looks now 🙂

This slideshow requires JavaScript.