java 用数组解决发奖金问题

过年了,村里要庆祝。村长说,村里有一笔钱作为奖金,让每个人写一个纸条上来,谁写的数目与奖金最接近,就算中,这笔奖金就归谁,如果多人猜中,则平分。编写程序,算算都有哪些人得到奖金?多少?

            这个能用数组写一个程序给我吗  想看看成品 自己搞不明白。。
import java.util.Collections;
import java.util.Comparator;
import java.util.Arrays;

class Q707984 {
    public static void main(String[] args) {
        int award = 100;
        String[] people = { "a", "b", "c", "d", "e", "f", "g", "h" };
        Integer[] guess = { 75, 70, 80, 120, 100, 110, 100, 45 };

        Integer[] ordered = new Integer[people.length];
        for (int i = 0; i < ordered.length; i++) ordered[i] = i;
        Arrays.sort(ordered, new Comparator<Integer>() {
            @Override
            public int compare(Integer a, Integer b) {
                int x = guess[a] - award > 0 ? guess[a] - award : award - guess[a];
                int y = guess[b] - award > 0 ? guess[b] - award : award - guess[b];
                return x - y;
            }
        });
        int maxp = 0;
        int i = 0;
        while (guess[ordered[i++]] == award) maxp++;
        if (maxp <= 1)
            System.out.println(people[ordered[0]] + "一人得奖" + award + "元。");
        else
        {
            for (i = 0; i < maxp; i++)
                System.out.print(people[ordered[i]] + " ");
            System.out.println("共同得奖" + award / (float)(maxp) + "元。");
        }
    }
}

图片说明

如果多人一样,但是都有误差,也平分,那么
int i = 0;
while (guess[ordered[i++]] == award) maxp++;
修改为
int i = 1;
while (guess[ordered[i++]] == guess[0]) maxp++;

如果问题得到解决,请点我回答左上角的采纳,谢谢

可以先遍历找到猜的最近距离是多少,再遍历一遍找到等于最近距离的人,把他们的数据存起来,最后进行操作就简单了

 import java.util.Scanner;
class people{
    String name;
    double guess;
}
public class bonus {
    public static void main(String []args) {
        Scanner Input=new Scanner(System.in);
        System.out.print("输入村民人数和奖金:");
        double sum;     //奖金
        double min;     //最近距离
        int n;          //村民人数
        int m=0;        //中奖人数
        n=Input.nextInt();
        min=sum=Input.nextDouble();
        people my[]=new people[n]; 
        for (int i=0;i<n;i++) {
            my[i]=new people();
            my[i].name=Input.next();
            my[i].guess=Input.nextDouble();
            min=Math.abs(my[i].guess-sum)<min?Math.abs(my[i].guess-sum):min;
        }
        System.out.println("以下村民中奖");
        for(int i=0;i<n;i++) {
            if(Math.abs(my[i].guess-sum)==min) {
                m++;
                System.out.println(my[i].name);
            }
        }
        System.out.println("奖金为"+sum/m);
    }
}

图片说明

其实思路很简单呀 用数组的话 把所有猜的数目都存放在数组里面 然后排个序 再用预定的奖金数字去遍历一遍数组 插入排序一下 他附近的不就是嘛。

/**
*
* @Description:过年了,村里要庆祝。村长说,村里有一笔钱作为奖金,
* 让每个人写一个纸条上来,谁写的数目与奖金最接近,
* 就算中,这笔奖金就归谁,如果多人猜中,则平分。
* 编写程序,算算都有哪些人得到奖金?多少?
* @param bonus 奖金
* @param obj key:人, value:猜测金额
* @return Map key:人 value:活动奖金金额
* @throws
*/
public static Map bonus(Double bonus, Map obj){
Map map = new HashMap<>();
if (obj.isEmpty()) {
return map;
}
Set keySet = new HashSet<>();
Double tmpValue = Double.MAX_VALUE;
for (String key: obj.keySet()) {
if (Math.abs(obj.get(key) - bonus) < tmpValue) {
tmpValue = Math.abs(obj.get(key) - bonus);
keySet.clear();
keySet.add(key);
} else if (Math.abs(obj.get(key) - bonus) == tmpValue){
keySet.add(key);
}
}
BigDecimal b1 = new BigDecimal(bonus);
BigDecimal b2 = new BigDecimal(keySet.size());
BigDecimal divide = b1.divide(b2);
for (String key : keySet) {
map.put(key, divide.doubleValue());
}
return map;
}

/**
 * 
 * @Description:过年了,村里要庆祝。村长说,村里有一笔钱作为奖金,
 *                  让每个人写一个纸条上来,谁写的数目与奖金最接近,
 *                  就算中,这笔奖金就归谁,如果多人猜中,则平分。
 *                  编写程序,算算都有哪些人得到奖金?多少?
 * @param bonus  奖金
 * @param person 人
 * @param conjecture 猜测金额
 * @return Map<String,Double> key:人  value:活动奖金金额
 * @throws
 */
public static Map<String, Double> bonus(Double bonus, String[] person, Double[] conjecture){
    Map<String, Double> map = new HashMap<>();
    if (person == null || conjecture == null || person.length == 0
            || conjecture.length == 0 || person.length != conjecture.length) {
        return map;
    }

    Set<String> keySet = new HashSet<>();
    Double tmpValue = Double.MAX_VALUE;
    for (int i = 0; i < conjecture.length; i++) {
        Double value = conjecture[i];
        String key = person[i];
        if (Math.abs(value - bonus) < tmpValue) {
            tmpValue = Math.abs(value - bonus);
            keySet.clear();
            keySet.add(key);
        } else if (Math.abs(value - bonus) == tmpValue){
            keySet.add(key);
        }
    }
    BigDecimal b1 = new BigDecimal(bonus);
    BigDecimal b2 = new BigDecimal(keySet.size());
    BigDecimal divide = b1.divide(b2);
    for (String key : keySet) {
        map.put(key, divide.doubleValue());
    }
    return map;
}
 import java.util.Scanner;
class People {
    String name;//人名
    double guess;//猜测的数字
}
class BaseInfo{
    double bonus;//奖金数量
    int peoples;//村民人数
}
public class Bonus {

    private static Scanner input=new Scanner(System.in);

    public static void main(String []args) {
        BaseInfo baseInfo=buildBaseInfo(input);//活动基本信息
        People peoples[]=buildPeoples(baseInfo);//村民填写的纸条信息
        getGuessingNum(peoples,baseInfo);//获取获奖名单
    }

    /**
     * 获取猜中人数并打印
     * @return
     */
    private static void getGuessingNum(People[] peoples,BaseInfo baseInfo){
        double min=getMinNumber(peoples,baseInfo.bonus);//最接近奖金的数字
        int guessingNum=0;
        System.out.println("以下村民中奖");
        for(int i=0;i<baseInfo.peoples;i++) {
            if(Math.abs(peoples[i].guess-baseInfo.bonus)==min) {
                guessingNum++;
                System.out.println(peoples[i].name);
            }
        }
        System.out.println("奖金为"+baseInfo.bonus/guessingNum);
    }

    /**
     * 获取最接近奖金的数字
     * @return
     */
    private static double getMinNumber(People[] peoples,double min){
        for (int i=0;i<peoples.length;i++) {
            min=Math.abs(peoples[i].guess-min)<min?Math.abs(peoples[i].guess-min):min;
        }
        return min;
    }

    //整理抽奖活动的基本信息
    private static BaseInfo buildBaseInfo(Scanner Input){
        System.out.print("输入村民人数和奖金(空格隔开):");
        BaseInfo baseInfo=new BaseInfo();
        baseInfo.peoples=  Input.nextInt();//村民人数
        baseInfo.bonus=Input.nextDouble();//奖金
        return baseInfo;
    }

    /**
     * 收集村民填写的纸条
     * @param baseInfo
     * @return
     */
    private static People[] buildPeoples(BaseInfo baseInfo){
        People peoples[]=new People[baseInfo.peoples];
        for (int i=0;i<baseInfo.peoples;i++) {
            System.out.print("输入村民人姓名和猜测的数字(空格隔开):");
            peoples[i]=new People();
            peoples[i].name=input.next();
            peoples[i].guess=input.nextDouble();
        }
        return peoples;
    }
}