I wrote a method to get the maximum number in the queue , but I need to return the location of the maximum number in the queue .
this is the max method I wrote :
public int maxValue(int[] array) {
int maximum = array[0];
for (int i = 0; i < array.length; i++) {
if (array[i] > maximum) {
maximum = array[i];
}
}
return maximum;
}
Use a int maximumIndex besides:
int maximumIndex = 0;
...
maximumIndex = i;
...
return maximumIndex;
Related
I am trying to print an output that would find the max number and also print the index number of the array as well. I am able to print the max number but I am unable to print the index number.
public static int findMax(int[] allNumbers) {
int maxValue = allNumbers[0];
for (int i = 1; i < allNumbers.length; i++) {
if (allNumbers[i] > maxValue) {
maxValue = allNumbers[i];
}
}
return (int) maxValue;
}
my array:
int[] allNumbers = new int[inpNum];
I can call the max number with the following
findMax(number)
You can return an array of the max value and index:
public static int[] findMax(int[] allNumbers) {
int maxValue = allNumbers[0];
int index = 0;
for (int i = 1; i < allNumbers.length; i++) {
if (allNumbers[i] > maxValue) {
maxValue = allNumbers[i];
index = i;
}
}
return new int[] {maxValue , index};
}
I'm trying to make a method than returns the second bigger number of an array.
When I return the value, in console appears 2 or more values. I can't understand why is this happening. Can somebody help me to understand this, please?
I did a method to search the bigger value so I can use it on the one which returns the second bigger.
public class ThirdMax {
public static int maxNum (int[] array) { //Returns the bigger value of the array.
int aux = 0; //Variable to store the bigger value found and compare it with the rest.
for (int i = 0; i < array.length; i++) {
if(array[i] > aux) { //If the actual value is bigger than the aux
aux = array[i]; //override the aux value with actual value.
}
}
System.out.println(aux);
return aux;
}
public static int secondMax(int[] array) { //Returns the second bigger value on the array.
int valorMax = maxNum(array); //Store the bigger value on a variable so we can use it later.
int valorMax2 = 0; //Variable to store the result.
int[] auxArray = new int [array.length];
for (int i = 0; i < array.length; i++) {
if(array[i] == valorMax) { //When we get to the valorMax, we replace it in the array with a 0.
array[i] = 0;
} else {
auxArray[i] = array[i];
}
valorMax2 = maxNum(auxArray); //Search again the bigger value after the previous one is replaced by 0.
}
return valorMax2;
}
}
Thanks in advance for your time!
You call maxNum(auxArray); multiple times. Each of them prints a max value.
Hence you received multiple result.
To immediately resolve it, remove the print System.out.println(aux);
in your function.
And make only one print function right before you return
System.out.println(valorMax2);
return valorMax2;
But your code looks not good. It need multiple improvement.
To find the second biggest number, you only need to loop once like this:
public static int secondMax(int[] array) {
int max = Integer.MIN_VALUE; // Max value
int secondMax = Integer.MIN_VALUE; // Second max value, its our result
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
secondMax = max;
max = array[i];
} else if (array[i] > secondMax) {
secondMax = array[i];
}
}
return secondMax;
}
This looks OK, but can't extends to find n-th max number, because our if conditions will be very complex. Then you try to find max number once at a time:
// Return max number in array which is lower than ceilValue
// Return Integer.MIN_VALUE if no such value found
public static int maxValueBelow(int[] array, int ceilValue) {
int max = Integer.MIN_VALUE;
for (int i = 0; i<array.length; i++) {
if (array[i] < ceilValue && array[i] > max) {
max = array[i];
}
}
return max;
}
public static int findNthValue(int[] array) {
int maxValue = maxValueBelow(array, Integer.MAX_VALUE);
int secondMaxValue = maxValueBelow(array, maxValue);
int thirdMaxValue = maxValueBelow(array, secondMaxValue);
// You can improve this function by give it's a second parameter `n`, and use for loop to find the `n-th` max value.
}
Since you're setting the largest number to 0 you really don't need auxArray.
You also don't need a second valorMax.
You might want to refactor your code to the following.
public static int secondMax(int[] array) {
int valorMax = maxNum(array);
for (int i = 0; i < array.length; i++) {
if(array[i] == valorMax) {
array[i] = 0;
}
}
return maxNum(array); // just return the result of maxNum(array)
}
be sure to remove the print statement from maxNum if you don't want your program to print 2 numbers to console.
Because you put get second max function in the wrong place.
public static int secondMax(int[] array) {
int valorMax = maxNum(array);
int valorMax2 = 0;
int[] auxArray = new int [array.length];
for (int i = 0; i < array.length; i++) {
if(array[i] == valorMax) {
array[i] = 0;
} else {
auxArray[i] = array[i];
}
}
valorMax2 = maxNum(auxArray); // this should be out of loop
return valorMax2;
}
}
So far, I have this method, which is supposed to find the max age of a ArrayList. However, in my data, I have two values that are tied at 58 for joint max. How do I get the second 58 from this loop? the index of the first 58 is 1, but the index I need is 4. I cannot hard code.
public static int maxAge (ArrayList<Integer> ages) {
int hold = 0;
int max = 0;
for (int i = 0; i < ages.size(); i++) {
if (max < ages.get(i)) {
max = ages.get(i);
hold = i;
}
else i++;
}
return hold;
}
You can simply change your condition to:
if (max <= ages.get(i))
It depends on why you want the other 58. If you want to return the latest match, you can just loop backwards.
I know, is ugly. But I would try to write a functional version.
Optional<Integer> max = ages.stream()
.max(Integer::compare);
if (max.isPresent()) {
return IntStream.range(0, ages.size())
.mapToObj(pos -> {
return new int[] {pos, ages.get(pos)};
})
.filter(pair -> pair[1] == max.get())
.collect(Collectors.toCollection(LinkedList::new))
.getLast()[0];
} else
return 0;
There are multiple ways to change the condition to fit your description. Try this:
public static int maxAge (ArrayList<Integer> ages) {
int hold = 0;
int max = 0;
for (int i = 0; i < ages.size(); i++) {
if (max < ages.get(i) || max == ages.get(i) {
max = ages.get(i);
hold = i;
}
else i++;
}
return hold;
}
The code below, will enable you return all the indexes associated with the maximum value of your list. But you must run it on Java 8 since it use Lambda Expressions.
public static ArrayList<Integer> maxAge (ArrayList<Integer> ages ) {
int max = 0;
ArrayList<Integer> maxIndexes = new ArrayList<Integer>() ;
for (int i = 0; i < ages.size(); i++) {
if (max <= ages.get(i)) {
final int finalMax = max ;
final int finalIndex = i ;
maxIndexes.removeIf((elt)-> finalMax < ages.get(finalIndex)) ;
maxIndexes.add(i) ;
max = ages.get(i) ;
}
}
return maxIndexes ;
}
Ok so I'm trying to find the largest element in an array, and I realize this is not the best method to do this, it only works in some cases. Would appreciate some pointers on how to change my code so it works for all instances.
public static int maxArray(int[] a) {
int max = 0;
for (int j = 0; j < a.length-1; j++) {
if (a[j+1] > a[j]) {
max = a[j+1];
} else {
max = a[j];
}
}
return max;
}
I suggest you do it like so,
Start with max = a[0]; then loop with j from 1 to a.length.
Compare a[j] to max, that is if a[j] > max then set max = a[j];.
Use this method.
public static int maxArray(int[] a) {
int max = a[0]; // saves a bit of time
for (int j = 1; j < a.length; j++) {
if (a[j] > max) {
max = a[j];
}
}
return max;
}
This is pretty speedy and concise.
You need to compare the current element with maximum element, not with the next one.
if (a[j] > max) {
max = a[j];
}
In Java 8 You can use Stream:
public static int maxArray(int[] a) {
return Arrays.stream(a).max().getAsInt();
}
public static <T extends Object & Comparable<? super T>> T maxArray(T[] array) {
return Collections.max(Arrays.asList(array));
}
after you make calls to the function, eg:
Integer[] a = { 1, 5, -6, 3, 0, 2 };
Integer max = maxArray(a);
System.out.println(max);
public static int getMaxElement(int[] elements) {
int max = elements[0];
for (int j = 0; j < elements.length-1; j++) {
if (elements[j] > max) {
max = elements[j];
}
}
return max;
}
class CalorieExpenditures {
String activity
int lbs90
int lbs100
int lbs110
int lbs120
int lbs130
int lbs140
int lbs150
int lbs160
int lbs170
int lbs180
int lbs190
int lbs200
int lbs220
int lbs240
int lbs260
int lbs280
int lbs300
}
From the above POGO (b'se i am using grails).
How to find the nearest lbs property from POGO
e.g
if i pass 282 it will return lbs280 and if i pass 295 it will return lbs300.
logic is the difference between two values if the difference is same will return the grater value.
You can suggest java method or grails method to work with.
I need a simple program that finds nearest value.
Thanks in advance.
Below is example to find given number from int array, with nearest lower & upper
public class FindNearestInt
{
public static void main(String[] args)
{
Random random = new Random();
int array[] = new int[30];
//Initialise array with rendom values
for (int i = 0; i < array.length; i++)
{
array[i] = random.nextInt(200);
}
System.out.println(Arrays.toString(array));
Arrays.sort(array);
System.out.println(Arrays.toString(array));
// Number you want to find in array
int searchFor = 57;
//Nearest lower you searching for
int nearestLower = 0;
//Nearest upper you searching for
int nearestUpper = Integer.MAX_VALUE;
int searchForExist = -1;
for (int i = 0; i < array.length; i++)
{
int j = array[i];
if (j < searchFor)
{
if(j > nearestLower){
nearestLower = j;
}
} else if (j > searchFor){
if(j < nearestUpper){
nearestUpper = j;
}
} else {
nearestLower = -1;
nearestUpper = -1;
searchForExist = j;
break;
}
}
System.out.println("Nearest Lower : " + nearestLower);
// This will print -1 if number exist in array
System.out.println("Provided Number Already Exist : " + searchForExist);
System.out.println("Nearest Upper : " + nearestUpper);
}
}
A simpler and faster solution is to use a formula
public static int nearest(int num) {
return num < 90 ? 90 :
num < 200 ? Math.round(num/10.0) * 10 :
num < 300 ? Math.round(num/20.0) * 20 : 300;
def calorieExpendituresWeightCategory(float weight){
int nearest = 0;
int min = Integer.MAX_VALUE
CalorieExpenditures.properties.each {
if(it.toString().startsWith("lbs")){
int j = it.toString().substring(it.toString().indexOf("lbs"))
int k = (weight - j) * (weight - j)
if(k < min){
min = k
nearest = j
}
}
}
return nearest
}
This works for me i think simple and works for me.
Thanks for the answers.