我有這樣的如何從一個文件
id value
1 56
2 5
3 90
4 12
5 234
6 90
我試圖找到該文件最大值文件內容找到我的最大值。 例如:i=2
然後我的結果應該是234,90
。我應該能夠返回2個最大值。
如何做到這一點 基本上最多可以
if (value < min) {
min = value;
}
if (value > max) {
max = value;
}
隨着這種循環被確定我能夠拿到4最大值?
我有這樣的如何從一個文件
id value
1 56
2 5
3 90
4 12
5 234
6 90
我試圖找到該文件最大值文件內容找到我的最大值。 例如:i=2
然後我的結果應該是234,90
。我應該能夠返回2個最大值。
如何做到這一點 基本上最多可以
if (value < min) {
min = value;
}
if (value > max) {
max = value;
}
隨着這種循環被確定我能夠拿到4最大值?
這裏有一種方法,你可以從陣列獲取count
最大值,
public static int[] getMaxValues(int count, int... values) {
int[] v = values.clone();
Arrays.sort(v);
return Arrays.copyOfRange(v, v.length - count, v.length);
}
public static void main(String[] args) {
System.out.println(Arrays.toString(getMaxValues(2, 56, 5, 90, 12, 234, 90)));
}
輸出是(請求)
[90, 234]
如何獲得3個值以及我在問題中包含的循環。是否有其他方法 –
@SreeVeni對於三個值,將第一個參數傳遞給'getMaxValues( 3,56,5,90,12,234,90)' –
試試這個
import java.util.*;
public class Test {
public static void main(String ar[])
{
ArrayList<Integer> i = new ArrayList<Integer>();
i.add(200);
i.add(203);
i.add(250);
i.add(270);
i.add(20);
i.add(300);
i.add(60);
i.add(10);
System.out.println(i);
Collections.sort(i);
System.out.println(i);
int someValue = 3;
if(i.size()>=someValue)
{
for(int j = i.size() - 1; someValue>0; j--)
{
someValue--;
System.out.println(i.get(j));
}
}
}
}
而是完全排序元素,你可以填充一個優先級隊列並提取其根目錄兩次:
public static int[] minmax(File f)
{
int [] res = {-1,-1};
try {
Scanner scan = new Scanner(f);
scan.nextLine();
PriorityQueue<Integer> values = new PriorityQueue(10, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
while(scan.hasNextInt())
{
int id = scan.nextInt();
if(!scan.hasNextInt()) continue;
int val = scan.nextInt();
values.add(val);
}
scan.close();
res[0] = values.poll();
res[1] = values.poll();
} catch (FileNotFoundException ex) {
Logger.getLogger(Test2.class.getName()).log(Level.SEVERE, null, ex);
}
return res;
}
這樣做的想法是建立在O(n)的堆,但是,作爲@bcorso指出,Java的PriorityQueue
實現不提供生成時的複雜性。
不幸的是,Java中的PriorityQueue實現需要'O(nlogn)'來創建,所以它不會給你漸近更快的算法。爲此,您必須創建自己的堆並實施自下而上的創建以獲得「O(n)」優勢。 – bcorso
@bcorso我認爲理所當然的,Java的'PriorityQueue'將使用提供所需的'O(n)'時間複雜度的堆實現。你是對的。不過,我想建議OP使用這種數據結構。 –
如果你正在尋找從數組中找到前K元素則有幾個方式做到這一點:
示例代碼:
package impatient;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
public class Test1 {
public static void main(String[] args) {
Test1 test1 = new Test1();
List<Integer> list = new ArrayList<Integer>();
list.add(56);
list.add(5);
list.add(90);
list.add(12);
list.add(234);
list.add(90);
test1.findTopN(list, 2);
test1.findTopN(list, 4);
}
private void findTopN(List<Integer> list, int n) {
TreeSet<Integer> sortedList = new TreeSet<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return a > b ? 1 : -1;
}
});
sortedList.addAll(list);
Iterator<Integer> it = sortedList.descendingIterator();
int index = 0;
System.out.print("Top " + n + " elements : ");
while (it.hasNext() && index < n) {
System.out.print(it.next() + ", ");
index++;
}
System.out.println();
}
}
輸出:
Top 2 elements : 234, 90,
Top 4 elements : 234, 90, 90, 56,
public void findHighest(int[] array){
int highest = array[0];
int secondHighest = array[0];
for(int i=0;i<array.length;i++) {
if(array[i] > highest){
secondHighest = highest;
highest = array[i];
}
} // end for
} // end method
一對夫婦的方式與利弊解決你的問題:
description | pros | cons
------------------------------------------------------------------------------
Collections.sort | simple | inefficient O(nlogn)
selection algorithm | efficient O(n) | implement from scratch, not sorted
PriorityQueue | simple | inefficient O(nlogn)
heap (bottom up) | efficient O(n + klogn) | implement from scratch
for-loop | efficient O(n), simple | hardcoded for k = 2
bubble sort | efficient if k << n | O(kn) --> O(n^2) if k~n
這是一個for-loop方法的實現,如果你只需要一個固定的k
的2
就可以工作。
public int[] largestTwo(int[] A){
int[] largest = new {A[0], A[0]};
for(int i = 0; i < A.length; i++) {
if(A[i] >= largest[0]){
largest[1] = largest[0];
largest[0] = A[i];
}else if(A[i] > largest[1]){
largest[1] = A[i];
}
}
return largest;
}
試試這個,希望這有助於
import java.util.*;
public class TestNumber {
public static void main(String args[]) {
int[] ints = { 2, 56, 5, 90, 12, 234, 90 };
Integer i = 3;
getMaxValues(ints, i);
}
private static void getMaxValues(int[] ints, Integer i) {
int maxRange = i;
List<Integer> intList = new ArrayList<Integer>();
for (int index = 0; index < ints.length; index++) {
intList.add(ints[index]);
}
Collections.sort(intList);
System.out.println("The maximum requested numbers are :");
if (intList.size() >= maxRange) {
for (int j = intList.size() - 1; maxRange > 0; j--) {
maxRange--;
System.out.println(intList.get(j));
}
}
}
}
你被困在哪一部分? –
我在存儲2個最大值時感到困惑 –
請更清楚一點。 –