This is the complete solution to find the leader numbers from given array of the numbers This solution is designed to to solve the problem using an interface, super class and two derived classes implementing the interface.
package pack1;
import java.util.List;
public interface LeaderIntf {
/* Define the functional interface with SAM 'RdInputArray' */
public List<Integer> RdInputArray(Integer[] arrayNums);
/* Define the static method 'displayMsg' */
static void displayMsg(List<Integer> leaderArray) {
System.out.println("The leaders numbers from the given array");
System.out.println(leaderArray);
}
}
package pack1;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.logging.Logger;
import java.util.stream.IntStream;
class ReadInputArrayNums {
private Integer[] inputArrayNums;
/* Declare the logger object for the class to display the log messages */
static Logger logger = Logger.getLogger(ReadInputArrayNums.class.getName());
public boolean validateInputs(Integer[] inputArrayNums) {
/* Fetch the class object's name from which this method is called */
String cName = Thread.currentThread().getStackTrace()[2].getClassName();
String mName = "validateInputs()";
logger.info("This method '" + mName + "' called from the Class '" + cName + "'");
/* Validating the function parameters using Optional Integer Array data type */
Optional<Integer[]> inputArrayVals= Optional.ofNullable(inputArrayNums);
/*
* Fetch the value of the Optional Integer Array of inputArrayNums using 'isPresent'
* condition check. If the value is available use 'get' method otherwise simply
* return 'false' to stop the program execution without proceeding further.
*/
if (inputArrayVals.isPresent()) {
if (inputArrayNums.length != 0)
setInputArrayNums(inputArrayVals.get());
else
return false;
} else
return false;
logger.info("The provided Input validated Successfully");
return true;
}
/* Define getter and setters for an inputArrayNums array values */
public Integer[] getInputArrayNums() {
return inputArrayNums;
}
public void setInputArrayNums(Integer[] inputArrayNums) {
this.inputArrayNums = inputArrayNums;
}
}
class LeaderNumbers_Using_Array_Backward extends ReadInputArrayNums implements LeaderIntf {
public List<Integer> RdInputArray(Integer[] inpVal) {
/* Fetch the class object's name from which this method is called */
String cName = Thread.currentThread().getStackTrace()[2].getClassName();
String mName = "RdInputArray";
logger.info("This method '" + mName + "' called from the Class '" + cName + "'");
List <Integer> leaderNumsList = new ArrayList<Integer>();
if (validateInputs(inpVal)) {
int leadNum = getInputArrayNums()[getInputArrayNums().length - 1];
// Processing the numbers in the backward direction
leaderNumsList.add(leadNum);
/*
* For each number from the backside of the array checking whether it's left
* side number is large
*/
for (int k = getInputArrayNums().length - 1; k >= 0; k--) {
if (getInputArrayNums()[k] > leadNum) {
leadNum = getInputArrayNums()[k];
leaderNumsList.add(leadNum);
}
}
} else
logger.info("The given Input Array numbers are null");
LeaderIntf.displayMsg(leaderNumsList);
return leaderNumsList;
}
}
class LeaderNumbers_Using_Array_Forward extends ReadInputArrayNums implements LeaderIntf {
public List<Integer> RdInputArray(Integer[] inpVal) {
/* Fetch the class object's name from which this method is called */
String cName = Thread.currentThread().getStackTrace()[2].getClassName();
String mName = "RdInputArray";
logger.info("This method '" + mName + "' called from the Class '" + cName + "'");
List <Integer> leaderNumsList = new ArrayList<Integer>();
if (validateInputs(inpVal)) {
for (int i = 0; i < getInputArrayNums().length; i++) {
int j;
/*
* For each number from the frontside of the array checking whether it's right
* side number is less
*/
for (j = i + 1; j < getInputArrayNums().length; j++) {
if (getInputArrayNums()[i] < getInputArrayNums()[j])
break;
}
if (j == getInputArrayNums().length)
leaderNumsList.add(getInputArrayNums()[i]);
}
} else
logger.info("The given Input Array numbers are null");
LeaderIntf.displayMsg(leaderNumsList);
return leaderNumsList;
}
}
class LeaderNumbers_Using_Streams extends ReadInputArrayNums implements LeaderIntf {
public List<Integer> RdInputArray(Integer[] inpVal) {
/* Fetch the class object's name from which this method is called */
String cName = Thread.currentThread().getStackTrace()[2].getClassName();
String mName = "RdInputArray";
logger.info("This method '" + mName + "' called from the Class '" + cName + "'");
List <Integer> leaderNumsList = new ArrayList<Integer>();
if (validateInputs(inpVal)) {
IntStream.range(0, getInputArrayNums().length)
.map(j -> getInputArrayNums().length - j - 1)
.filter(k -> getInputArrayNums()[k] >= getInputArrayNums()[getInputArrayNums().length - 1])
.forEach(x -> leaderNumsList.add(getInputArrayNums()[x]));
} else
logger.info("The given Input Array numbers are null");
LeaderIntf.displayMsg(leaderNumsList);
return leaderNumsList;
}
}
public class LeaderNumsJ8 {
public static void main(String args[]) {
/*
* create the class object LeaderNumbers_Using_Array_Backward, and call the method
* RdInputArray
*/
Integer[] arrNums = { 10, 2, 41, 13, 8, 36, 7, 15, 21 };
LeaderNumbers_Using_Array_Backward LNUAB = new LeaderNumbers_Using_Array_Backward();
LNUAB.RdInputArray(arrNums);
/*
* create the class object LeaderNumbers_Using_Array_Forward, and call the method
* RdInputArray
*/
LeaderNumbers_Using_Array_Forward LNUAF = new LeaderNumbers_Using_Array_Forward();
LNUAF.RdInputArray(arrNums);
/*
* create the class object LeaderNumbers_Using_Streams, and call the method
* RdInputArray
*/
LeaderNumbers_Using_Streams LNUS = new LeaderNumbers_Using_Streams();
LNUS.RdInputArray(arrNums);
}
}
OUTPUT:
Jun 18, 2023 1:43:12 PM pack1.LeaderNumbers_Using_Array_Backward RdInputArray
INFO: This method 'RdInputArray' called from the Class 'pack1.LeaderNumsJ8'
Jun 18, 2023 1:43:12 PM pack1.ReadInputArrayNums validateInputs
INFO: This method 'validateInputs()' called from the Class 'pack1.LeaderNumbers_Using_Array_Backward'
Jun 18, 2023 1:43:12 PM pack1.ReadInputArrayNums validateInputs
INFO: The provided Input validated Successfully
The leaders numbers from the given array
[21, 36, 41]
Jun 18, 2023 1:43:12 PM pack1.LeaderNumbers_Using_Array_Forward RdInputArray
INFO: This method 'RdInputArray' called from the Class 'pack1.LeaderNumsJ8'
Jun 18, 2023 1:43:12 PM pack1.ReadInputArrayNums validateInputs
INFO: This method 'validateInputs()' called from the Class 'pack1.LeaderNumbers_Using_Array_Forward'
Jun 18, 2023 1:43:12 PM pack1.ReadInputArrayNums validateInputs
INFO: The provided Input validated Successfully
The leaders numbers from the given array
[41, 36, 21]
Jun 18, 2023 1:43:12 PM pack1.LeaderNumbers_Using_Streams RdInputArray
INFO: This method 'RdInputArray' called from the Class 'pack1.LeaderNumsJ8'
Jun 18, 2023 1:43:12 PM pack1.ReadInputArrayNums validateInputs
INFO: This method 'validateInputs()' called from the Class 'pack1.LeaderNumbers_Using_Streams'
Jun 18, 2023 1:43:12 PM pack1.ReadInputArrayNums validateInputs
INFO: The provided Input validated Successfully
The leaders numbers from the given array
[21, 36, 41]
The link to the JUnit5 test for this solution is here – https://atomic-temporary-185308886.wpcomstaging.com/2023/06/18/junittest-leadernums/

Leave a comment