Sunday, June 6, 2021

Reading in delimited line from text file in Java

 I have a text file in which I have stored some text data which describes the areas of Colombo which is also known as the Commercial capital of Sri Lanka. I need to read the data from a text file and display on screen with a different format.

There are many ways to reach this target. Here I have used BufferedReader to read the file line by line using a FileReader.

My project structure is as below.









Below is the text file (Colombo.txt)









So, here is the solution

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new FileReader("Colombo.txt"));
try{
String num;
String englishName;
String nativeName;
String readLine = br.readLine();
while (readLine != null){
num = readLine.split(",")[0];
englishName = readLine.split(",")[1];
nativeName = readLine.split(",")[2];

System.out.println("Colombo " + num + " - " + englishName + " - " + nativeName );
readLine = br.readLine();
}
}finally {
if(br != null){
br.close();
}
}
}
}

Let me explain the concept behind the try-with-resources statement in Java which is introduced in Java 7

The try-with-resources statement is a try statement that declares one or more resources .

A resource is an object that must be closed after the program is finished with it.

This statement ensures that each resource is closed at the end of the statement.

Coming back to our example, let me put the above challenge in a much cleaner way using try-with-resources statement instead of a try statement. 

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Main {
public static void main(String[] args) throws IOException{
try(BufferedReader br = new BufferedReader(new FileReader("Colombo.txt"))){
String num;
String englishName;
String nativeName;
String readLine = br.readLine();
while (readLine != null){
num = readLine.split(",")[0];
englishName = readLine.split(",")[1];
nativeName = readLine.split(",")[2];

System.out.println("Colombo " + num + " - " + englishName + " - " + nativeName );
readLine = br.readLine();
}
}
}
}

As you can see, I have declared the BufferedReader as a resource which doesn't need to be closed at the finally block explicitly. This reduces several lines of code and makes the code simpler.

Output


I hope it was useful...

download code

Sunday, December 13, 2020

Print name of each digit of a number in Java

 Challenge is to write a method to print the passed number using words for each of the digits. If the number is negative then print "Invalid Value". 

I simply used the String manipulations in Java to resolve this issue with aid of a Switch statement to identify each digit and get the corresponding name of the digit.

Below is my working solution and I hope it is helpful.

public class NumberToWords {
public static void numberToWords(int number){
String resultString = "";
if(number < 0){
resultString = "Invalid Value";
}else{
String numberString = String.valueOf(number);

for(int i=0; i<numberString.length(); i++){
int currentNumber = Character.getNumericValue
(numberString.charAt(i));

resultString = resultString +
getNameOfNumber(currentNumber) + " ";
}
}
System.out.println(resultString);
}

public static String getNameOfNumber(int num){
String numberName = "";
switch (num){
case 0 :
numberName = "Zero";
break;
case 1:
numberName = "One";
break;
case 2:
numberName = "Two";
break;
case 3:
numberName = "Three";
break;
case 4:
numberName = "Four";
break;
case 5:
numberName = "Five";
break;
case 6:
numberName = "Six";
break;
case 7:
numberName = "Seven";
break;
case 8:
numberName = "Eight";
break;
case 9:
numberName = "Nine";
break;
default:
numberName = "Invalid";
break;
}
return numberName;
}
}



How to find the greatest common divisor of two integers in java?

This was another coding challenge I came across while practising online. Little bit tricky, however, I found a solution (I say 'a' solution because there can be alternative ways to do the same) for it. 

So, what are we suppose to do here?

  • A method accepts two integer parameters and we need to find the highest divisible integer by which both the numbers could be divided without a remainder.
  • If either one of the given number is less than 10 then the method should return -10 indicating invalid input.
here is my solution and I hope it's helpful.

public class GreatestCommonDivisor {
public static int getGreatestCommonDivisor(int first, int second){
int greatestCommonDivisor = -1;

if(first >= 10 && second >= 10){
int smallerNumber = first < second ? first : second;

for(int i = smallerNumber ; i >= 1 ; i--){
if( (first % i == 0) && (second % i == 0)){
greatestCommonDivisor = i;
break;
}else{
continue;
}
}
}
return greatestCommonDivisor;
}
}

Java program to get only the even digit sum of a given integer

 Yet another coding challenge I came across and here is the challenge ; 

you are given an Integer number

return - 1 if it is a negative number

if not, calculate the sum of all the even digits of the given number

    e.g:- 1658 is given then sum = 6 + 8 which is 14

below is my solution and I hope it helps

public class EvenDigitSum {
public static int getEvenDigitSum(int number){
int sumOfEvenDigits = 0;

if(number < 0){
sumOfEvenDigits = -1;
}else{
int lengthOfNumber = String.valueOf(number).length();

for(int i=0 ; i< lengthOfNumber ; i++){
int currentNumber = Character.getNumericValue(String.valueOf(number).charAt(i));
if(currentNumber % 2 == 0){
sumOfEvenDigits += currentNumber;
}else{
continue;
}
}
}
return sumOfEvenDigits;
}
}


How to check a given number is a palindrome in Java ?

This is another online coding challenge I came across recently to which I found a simple solution with the use of String and StringBuffer in java. 

Let me explain the challenge here,

  • A given number is a palindrome when reversed is equal to the original number (e.g : 121, 45654,1001)
  • If the given number is a palindrome, then return true else return false
In my solution I basically convert the integer number to a string in order to reverse the number, Unfortunately java doesn't have a reverse method in String class (it's java 11 that I'm working with). However, StringBuilder has a reverse method to which a String needs to be parsed. So, here's what I'm doing.

get the Integer number --> convert to String --> convert to StringBuilder --> reverse the string --> convert back to String --> convert the string back to number --> store it in a new int variable --> compare with the original number --> return true if matches or return false unless otherwise

why do I use Math.abs() ?

This is simply to handle any negative numbers. for an instance, -232 is a palindrome but if we straight away convert it to string this will reverse the string as 232- which ends up with an invalid integer. To handle this, I have considered the absolute value by using Math.abs() function to only get the absolute value of the given number.

find my solution as below

public class NumberPalindrome {
public static boolean isPalindrome(int number){
boolean result = false;
number = Math.abs(number);
int reversedNumber = Integer.parseInt(new StringBuilder(String.valueOf(number)).reverse().toString());

if(number == reversedNumber){
result = true;
}
return result;
}
}

Simple Java program to calculate the sum of all the digits of a number

 I just came across a simple yet an interesting challenge when I was attempting some online coding practices and thought to share it with you. Firstly would like to state that there can be many ways to separate each digit of the given number but I have used the most convenient way by converting it to String and processing.

Let me explain you the challenge.

  • An integer number is given and it should be at least a two digit number (15, 896 etc but not 9). Return -1 if this is not met.
  • If the above condition is met, then sum up all the digits of the number and return.
find my solution as below

public class DigitSum {
public static int sumDigits(int number){
int sum = 0;
if(number >= 10){
int numOfDigits = String.valueOf(number).length();

for(int i=0; i<numOfDigits ; i++){
sum += Character.getNumericValue(String.valueOf(number).charAt(i));
}
}else{
sum = -1;
}
return sum;
}
}

Thursday, December 3, 2020

How to validate a username with the aid of regular expressions in Java?

 I find regular expressions interesting because if you got the right idea of when and how to use them, it will help you to reduce lines of code and would save time as well. 

In the below example, I am going to demonstrate on how to validate a simple username (assume username entered in a System during the Sign Up process) .

Rules

  • The username consists of 8 to 30 characters inclusive. If the username consists of less than 8 or greater than 30 characters, then it is an invalid username.
  • The username can only contain alphanumeric characters and underscores (_). Alphanumeric characters describe the character set consisting of lowercase characters [a-z] uppercase character [A - Z], and digits [0 - 9].
  • The first character of the username must be an alphabetic character, i.e., either lowercase character [a - z] or uppercase character [A -Z]

I am going to use the stdin to get inputs and stdout to print the results. The first input will indicate how many input strings (usernames) are going to be validated and subsequent inputs will indicate each username to be validated.

import java.util.Scanner;

class Validator {
public static final String regularExpression = "^[a-zA-Z][a-zA-Z0-9|_]{7,29}$";
}

public class UsernameValidator{
public static void main(String[] args) {
Scanner scanner = new Scanner (System.in);
int numOfUserNames = Integer.parseInt(scanner.nextLine());

while(numOfUserNames > 0){

String userName = scanner.nextLine();

if(userName.matches(Validator.regularExpression)){
System.out.println("Valid Username");
}else{
System.out.println("Invalid Username");
}
numOfUserNames--;
}
}
}

Input / Output:


5
Amanda
Invalid Username
Cassandra
Valid Username
Amelia_2134
Valid Username
1Jessica231
Invalid Username
Emma_654424
Valid Username

Explanation to the regular expression I used above

^ [a-zA-Z] --> indicates the beginning of the string which should contain a-z or A-Z (only alphabets)
[a-zA-Z-0-9_] --> indicates the string starting from the second character of the username which can consists of alphabets, digits or _. No Symbols allowed here. 
{7,29}  --> indicates the length of the username starting from the second character. which is 7 to 29 character long.

A great approach to practice regular expressions is to create your own simple java programs and imagine various types of validations that could perform in a System, and crack them with the aid of Regular expressions instead of using String manipulations or conditional blocks to resolve the challenges.