【求教】JAVA LIST 列出前三项

joe1234pk 2011-08-31 11:32:43
求写方法 已有 LinkedList<Stock> stk = new LinkedList<Stock>()
要求在不重排LIST顺序的情况下 按LIST里某一值(例如price()) 列出前三大的Stock 的资料
本人是JAVA 新手 求各位高手!!!!!!!!
...全文
171 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
joe1234pk 2011-09-06
  • 打赏
  • 举报
回复
谢谢你的方法 但我忽略了一个重点 令问题又升级一个地步 还是那个例子 这是一个股票的例子 比方说STKS力都是股票 每个都有它的名字.code()(顺序比如说是BHP CTX RIO VBA VCA VAB...),如果是.Price()显示同价 他要以他本身的顺序排
就是说 如果有最大 先排最大 如果有同价 按本身顺序排 我现在是卡着这步上 求大大指点迷津啊[Quote=引用 1 楼 k3108001263 的回复:]

Java code

import java.util.*;
public class FindTopThree {
public static void main(String[] args) {
LinkedList<Stock> stk = new LinkedList<Stock>();
for(int i=0; i<10; i++)//随机产生10个1到10……
[/Quote]
joe1234pk 2011-09-06
  • 打赏
  • 举报
回复
ER..最优方法无可争议是用COMPARATOR 然后SORT...但某种原因我不能再用这个办法[Quote=引用 6 楼 t842938838 的回复:]

先用for把集合里的给另一个集合然后用collection.sort() 排序 只输出3个
[/Quote]
小绵羊 2011-09-06
  • 打赏
  • 举报
回复
贴一个数组中找出最大的3个数的算法。

public static void main(String[] args) throws Exception {
int[] arr = { 9, 8, 7, 10, 23, 45, 6, 2, 1, 0, 7, 8, 5, 2 };

//將三個臨時變量設置為數組的前三個數
int a = arr[0];
int b = arr[1];
int c = arr[2];

//使這三個變量有序
if (c > b) {
b = b ^ c;
c = b ^ c;
b = b ^ c;
}
if (b > a) {
a = b ^ a;
b = b ^ a;
a = b ^ a;
}
//遍歷數組,與臨時變量進行比較,並始終保持三個臨時變量有序
for (int i : arr) {
if (i > a) {
c = b;
b = a;
a = i;
}
if (i < a && i > b) {
c = b;
b = i;
}
if (i < b && i > c) {
c = i;
}

}
System.out.println(a + " " + b + " " + c);
}
小绵羊 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qybao 的回复:]

不重排,那就直接遍历就好了
Java code
LinkedList<Stock> stk = new LinkedList<Stock>();
...
List<Integer> idxList = new ArrayList<Integer>(); //用于记录stk的相关下标
double maxPrice = 0; //临时最大price
for (int i=0; i<stk.si……
[/Quote]
阿宝,要是第一个就是最大的你的这个就不灵了。
soft200816 2011-09-06
  • 打赏
  • 举报
回复
对于这种问题,我觉得有点太为了功能而功能了!如果不排序,至少也要遍历3骗,如果数据量大还有点道路,数据量本身不大,其实调用系统的排序方法未必有错。至少是经过优化的,比我们简单的比较要快些!
qybao 2011-09-01
  • 打赏
  • 举报
回复
不重排,那就直接遍历就好了
LinkedList<Stock> stk = new LinkedList<Stock>();
...
List<Integer> idxList = new ArrayList<Integer>(); //用于记录stk的相关下标
double maxPrice = 0; //临时最大price
for (int i=0; i<stk.size(); i++) { //遍历寻找最大
if (maxPrice < stk.get(i).getPrice()) { //当找到某个大price的时候
idxList.add(0, i); //把该大price的下标保存
maxPrice = stk.get(i).getPrice(); //并让最大price=当前price
}
}
int idx = 0;
for (idx=0; idx<Math.min(3, idxList.size()); idx++) { //遍历下标集合打印
System.out.println(stk.get(idxList.get(idx)));
}
for (int i=0; idx<3; i++, idx++) { //如果找到的最大小于3个,说明其他的都是相同的price
if (! idxList.contains(i)) { //继续打印其他price,直到达到3个
System.out.println(stk.get(i)));
}
}
t842938838 2011-09-01
  • 打赏
  • 举报
回复
先用for把集合里的给另一个集合然后用collection.sort() 排序 只输出3个
打油的程序员 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 leehomwong 的回复:]

能不能用冒泡排序~
[/Quote] 我的2楼方法就相当于冒泡了,只要把3个if用for代替

24K純帥 2011-09-01
  • 打赏
  • 举报
回复
能不能用冒泡排序~
打油的程序员 2011-09-01
  • 打赏
  • 举报
回复
还可以模仿插入排序,但效率上也没提高,多内嵌了两个循环,代码更加不雅观
打油的程序员 2011-09-01
  • 打赏
  • 举报
回复
粗心了

import java.util.*;

import com.sun.org.apache.bcel.internal.generic.SWAP;

public class FindTopThree {
public static void main(String[] args) {
LinkedList<Stock> stk = new LinkedList<Stock>();
for (int i = 0; i < 10; i++)
// 随机产生10个1到100之间的price建立Stock对象,并添加进List中
stk.add(new Stock((int) (Math.random() * 100) + 1));
System.out.println("========原始数据========");
System.out.println(stk);

Stock[] stocks = new Stock[] { stk.get(0), stk.get(1), stk.get(2) };// 假设前三个stock最大
for (int i = 3; i < stk.size(); i++) {
Stock s = stk.get(i);
if (s.price() > stocks[0].price) {
Stock temp = s;
s = stocks[0];
stocks[0] = temp;
}
;// 如果大于数组第0个Stock

if (s.price() > stocks[1].price) {
Stock temp = s;
s = stocks[1];
stocks[1] = temp;
}
;// 如果大于数组第1个Stock

if (s.price() > stocks[2].price) {
Stock temp = s;
s = stocks[2];
stocks[2] = temp;
}
;// 如果大于数组第2个Stock
}
System.out.println("========最大三个========");
System.out.println(Arrays.toString(stocks));
}
}

class Stock {
int price = 0;

Stock(int price) {
this.price = price;
}

int price() {
return price;
}

public String toString() {
return "" + price;
}
}
/*
========原始数据========
[1, 53, 95, 18, 55, 61, 9, 73, 71, 35]
========最大三个========
[73, 71, 95]
*/


打油的程序员 2011-09-01
  • 打赏
  • 举报
回复

import java.util.*;
public class FindTopThree {
public static void main(String[] args) {
LinkedList<Stock> stk = new LinkedList<Stock>();
for(int i=0; i<10; i++)//随机产生10个1到100之间的price建立Stock对象,并添加进List中
stk.add(new Stock((int) (Math.random()*100)+1));
System.out.println("========原始数据========");
System.out.println(stk);

Stock [] stocks = new Stock[]{stk.get(0),stk.get(1),stk.get(2)};//假设前三个stock最大
for(int i = 3; i< stk.size(); i++) {
Stock s = stk.get(i);
if(s.price()>stocks[0].price) stocks[0] = s;//如果大于数组第0个Stock
else if(s.price()>stocks[1].price) stocks[1] = s;//如果大于数组第1个Stock
else if(s.price()>stocks[2].price) stocks[2] = s;//如果大于数组第2个Stock
else ;//什么都不做
}
System.out.println("========最大三个========");
System.out.println(Arrays.toString(stocks));
}
}

class Stock{
int price = 0;
Stock(int price) {
this.price = price;
}
int price() {
return price;
}
public String toString() {
return "" + price;
}
}
/*output:
========原始数据========
[78, 39, 72, 95, 38, 16, 99, 40, 88, 60]
========最大三个========
[99, 88, 72]
*/

softroad 2011-09-01
  • 打赏
  • 举报
回复

LinkedList<Stock> stk = new LinkedList<Stock>()

Collections.sort(stk, new Comparator<Stock>() {
public int compare(Stock s1, Stock s2) {
return (int) (s2.getPrice() - s1.getPrice())
}
});

stk.get(0), stk.get(1), stk.get(2)

如果不对改成s1.getPrice() - s2.getPrice()


调试下。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧