数组A 中存放 等级信息
数组B 中存放 高度信息
数组C 中存放 变化量信息
A、B、C中的信息都是一一对应的,数量都是相等的。
最大等级是已知的为3
现在比较这三个数组,按如下规则取出唯一一对记录(等级、高度、变化量)。
等级比较 ---> 高度比较 ---> 变化量比较
具体如下:
首先 取出等级A 中等级最大的的几对记录 ABC_1,
然后在 等级最大记录ABC_1中 比较高度,取出高度最大的几对记录ABC_2,
然后在 高度最大记录ABC_2中 比较变化量,最后取出变化量最大的几对记录 ABC_3。
当然了,如果以上三次比较中,任何一次结果为1条数据的话,就不用继续比较了。
不知道各位有什么好的算法建议。
看这个吧,我测试过了,是按我上面理解的意思。最上面的程序少了两句话。
import java.util.*;
public class ArrayCompare{
private ArrayList index = new ArrayList();
private ArrayList _index = new ArrayList();
public ArrayList<Integer> compare(int [] a,int [] b,int [] c){
for(int i =0;i<a.length;i++){
_index.add(i);
}
check(a);
if(index.size() == 1)
return index;
check(b);
if(index.size() == 1)
return index;
check(c);
return index;
}
public void check(int [] x){
index.clear();
int max = x[((Integer)_index.get(0)).intValue()];
for(Integer i : _index){
int ii = i.intValue();
if(x[ii]>max){
max=x[ii];
index.clear();
}
if(x[ii] == max)
index.add(ii);
}
_index.clear();
_index.addAll(index);
}
public static void main(String [] args)throws Exception{
ArrayCompare ac = new ArrayCompare();
int []a = new int[]{0,2,3,3,2,3,1};
int []b = new int[]{2,3,7,6,4,7,8};
int []c = new int[]{2,3,4,2,1,0,3};
ArrayList<Integer> aa = ac.compare(a,b,c);
for(Integer i : aa){
int ii = i.intValue();
System.out.println(a[ii]);
System.out.println(b[ii]);
System.out.println(c[ii]);
}
}
}
简单实现了一下,等待高手
class ArrayCompare{
private ArrayList index = new ArrayList();
private ArrayList _index = new ArrayList();
public ArrayList<Integer> compare(int [] a,int [] b,int [] c){
for(int i =0;i<a.length;i++){
_index.add(i);
}
check(a);
if(index.size() == 1)
return index;
check(b);
if(index.size() == 1)
return index;
check(c);
return index;
}
public void check(int [] x){
int max = x[index.get(0)];
for(int i : _index){
if(x[i]>max){
max=x[i];
index.clear();
}
if(x[i] == max)
index.add(i);
}
_index.addAll(index);
}
}
第一个方法的第一个循环里漏了一句index.add(i);
或者把第二个方法的第一句的index换成_index
不好意思,我也没测试,回答2和3任选一个,应该没问题了。
对了,有些类型没做转换
package com;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
/**
@author 蒲佳BOSS
*
*/
class ABC {
private List maxIndex = new ArrayList();
private int[] A;
private int[] B;
private int[] C;
/**
构造一个结构,并执行查找find方法
@param a
@param b
@param c
/
public ABC(int a[], int b[], int c[]) {
this.A = a;
this.B = b;
this.C = c;
find();
}
/*
私有的find方法:通过一个内部类Tmp来定制index-value对,算法是:
A B C数组比较优先级是A>B>C,所以我们可以这样,A*100+B*10+C就把大小完全体现出来了,通过排序Tmp,
得到最大的值列表
*
/
private void find() {
/*
* 内部类
* @author 蒲佳BOSS
*
*/
class Tmp {
public int value;
public int index;
public Tmp(int v, int i) {
value = v;
index = i;
}
public String toString() {
return "Index=" + index + " Value=" + value;
}
}
//将所有数组合并为一个List<Tmp>
List<Tmp> list = new ArrayList<Tmp>();
for (int i = 0; i < this.A.length; i++) {
Tmp t = new Tmp(this.A[i] * 100 + this.B[i] * 10 + this.C[i], i);
list.add(t);
}
//排序list,通过比较器
Collections.sort(list, new Comparator<Tmp>() {
public int compare(Tmp o1, Tmp o2) {
if (o1.value < o2.value)
return 1;
return 0;
}
});
//将前面最大值的index的添加到maxIndex
int tmp = list.get(0).value;
maxIndex.add(list.get(0).index);
for (int i = 1; i < list.size(); i++)
if (list.get(i).value < tmp)
break;
else
maxIndex.add(list.get(i).index);
}
public List getMaxIndex() {
return this.maxIndex;
}
public void showMax() {
for (int i : maxIndex) {
System.out.println("MAX: index=" + i + " A=" + this.A[i]
+ " B=" + this.B[i] + " C=" + this.C[i]);
}
}
}
public class Test {
public static void main(String[] st) {
int[] a = { 4, 5, 6, 7, 8, 3, 4, 5 };
int[] b = { 4, 7, 6, 2, 4, 6, 7, 8 };
int[] c = { 5, 4, 3, 5, 6, 7, 4, 5 };
ABC abc = new ABC(a, b, c);
abc.showMax();
}
}
/*
简易版本
package com;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
@author 蒲佳BOSS
*
*/
class ABCTest {
private int a;
private int b;
private int c;
private int index;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public int getC() {
return c;
}
public void setC(int c) {
this.c = c;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String toString(){
return "index="+index+" A="+a+" B="+b+" C="+c+"\n";
}
}
/**
其实算法很简单,比较器了比较就Ok了。
A B C
5 5 6
6 5 3
4 6 9
8 1 0
8 0 0
7 2 9
你还没发现其实就是个1000以内的整数比较吗
@author 蒲佳BOSS
*
*/
public class Main{
public static void main(String[] str){
List list=new ArrayList();
int[] a = { 4, 5, 6, 7, 8, 3, 4, 5 };
int[] b = { 4, 7, 6, 2, 4, 6, 7, 8 };
int[] c = { 5, 4, 3, 5, 6, 7, 4, 5 };
for(int i=0;i ABCTest t=new ABCTest();
t.setA(a[i]);
t.setB(b[i]);
t.setC(c[i]);
t.setIndex(i);
list.add(t);
}
Collections.sort(list, new Comparator() {
public int compare(ABCTest o1, ABCTest o2) {
if (o1.getA()*100+o1.getB()*10+o1.getC() < o2.getA()*100+o2.getB()*10+o2.getC())
return 1;
return 0;
}
});
System.out.println(list);
}
}
如果你的 B C值是超过10的,那么请使用
o2.getA()*100000+o2.getB()*1000+o2.getC()*1
反正乘以你数组中最大的一个值;
比如:
A - B - C
2 567 345
1 999(max) 546
3 0 876(max)
A*(999*876)+B*876+C 比较器
看来我对题目理解有误?
a[0,2,3,3,2,3,1]
b[2,3,7,6,4,7,8]
c[2,3,4,2,1,0,3]
这个结果是3,7,4么?如果不是,那我就理解错了