簡體   English   中英

如何比較對象數組中對象的值?

[英]How do i compare the values of objects in an object array?

我的代碼輸出這個:

Computer 1 bets 5
Computer 2 bets 8
Computer 3 bets 4
Computer 4 bets 3
Computer 5 bets 8

我想創建一個方法“displayWinners()”來比較這個數組中所有對象的賭注值並返回所有具有最高賭注值的對象ID,在這種情況下它將是計算機2和5,下注為8. 我該怎么做?

public class Computer {
    Computer[] c;
    private int id;
    private int bet;

    public void create(int numComps) {
        int i;
        c = new Computer[numComps];

        for (i = 0; i < numComps; i++) {

            c[i] = new Computer();
            c[i].id = i+1;
            c[i].bet = bet();
            c[i].display();
        }
        displayWinners();
    }

    public int bet() {
        return (int) (Math.random() * 10) + 1;
    }

    public void display() {
        String name = "Computer " + id;
        System.out.println(name + " bets " + bet);
    }

    public void displayWinners() {
        System.out.println();
    }

    public static void main(String[] args) {
        Computer c = new Computer();
        c.create(5);
    }

}

為什么不為最大值的索引和值本身分配一個變量,並在執行函數 bet() 時不斷檢查和重寫變量。

下面的代碼沒有得到正確驗證,只是看看。

public class Computer {
Computer[] c;
private int id;
private int bet;
private List<Integer> maxId;
private int maxBet;

public void create(int numComps) {
    int i;
    c = new Computer[numComps];
    maxId = new ArrayList<Integer>();
    maxBet = 0;

    for (i = 0; i < numComps; i++) {

        c[i] = new Computer();
        c[i].id = i+1;
        c[i].bet = bet();
        c[i].display();

        if(c[i].bet > maxBet) {
            maxId = new ArrayList<Integer>();
            maxId.add(c[i].id);
            maxBet = c[i].bet;
        }
        else if(c[i].bet == maxBet) {
            maxId.add(c[i].id);
        }
    }
    displayWinners();
}

public int bet() {
    return (int) (Math.random() * 10) + 1;
}

public void display() {
    String name = "Computer " + id;
    System.out.println(name + " bets " + bet);
}

public void displayWinners() {
    System.out.format("Computer %d", maxId.get(0));
    if(maxId.size() > 1) {
        for(int i=1; i<maxId.size(); i++) {
            System.out.format(" and %d", maxId.get(i));
        }
    }
    System.out.format(" with a bet of %d\n", maxBet);
}

public static void main(String[] args) {
    Computer c = new Computer();
    c.create(5);
}

}

好的,只是為了好玩,提供一個小技巧。

你只需迭代你的數組。 然后,我會將當前賭注與使用Integer.compare已知的最大值進行比較,並根據結果,我將:

  • r > 0 - 清除列表並將實例添加到列表中
  • r == 0 - 將實例添加到列表中
  • r < 0 - 什么都不做

很高興知道,該方法返回的實際值更簡單[-1, 0, 1] ,很快就會有問題。

現在,我們可以看到添加到列表中的一些冗余,為了減少它,我們可以使用switch代替if s。

List<Computer> winners = new ArrayList<Computer>();
for ( Computer c : computers ){
    int r = Integer.compare(c.getBet(), maxBet);
    switch(r){
        case 1: //Current bet is higher
            maxIds.clear();
            maxBet = c.getBet();
        case 0: //Current bet is equals
            winners.add(c);
        case -1: //Current bet is lower (optional line, just for the explanation)
    }
}

由於我不使用break ,我們清除list ,我們將添加到其中。

注意:如果Integer.compare實現更改,應添加故障安全。 文檔說明它將返回任何值而不是 -1、0 或 1。但當前的實現更簡單:

public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

首先,我建議你拆分存儲和業務邏輯。 將顯示Computer類的所有方法移出。

因此,要找到獲勝者,您必須執行以下步驟:

  1. 創建計算機列表(可以創建數組或列表);
  2. 遍歷集合一次以找到最高賭注;
  3. 第二次迭代集合以過濾掉所有賭注最高的計算機。

如果你問這樣的問題,那么我想,你現在不需要提供不同的排序算法或特殊的數據結構(它們都做同樣的事情,但對於大輸入數據要快得多)。

這是可能的解決方案之一(我盡量保持簡單):

public class Foo {

    public static void main(String[] args) throws IOException {
        Computer[] computers = createComputer(5);
        int highestBet = getHighestBet(computers);
        List<Integer> ids = getIdsWithBet(computers, highestBet);
        System.out.println(ids.stream().map(String::valueOf).collect(Collectors.joining(",")));
    }

    private static int getHighestBet(Computer... computers) {
        int max = 0;

        for (Computer computer : computers)
            max = Math.max(max, computer.getBet());

        return max;
    }

    private static List<Integer> getIdsWithBet(Computer[] computers, int bet) {
        List<Integer> ids = new ArrayList<>(computers.length);

        for (Computer computer : computers)
            if (computer.getBet() == bet)
                ids.add(computer.getId());

        return ids;
    }

    // you van use List<Computer>
    private static Computer[] createComputer(int total) {
        Random random = new Random();
        Computer[] computers = new Computer[total];

        for (int i = 0; i < computers.length; i++) {
            computers[i] = new Computer(i + 1, random.nextInt(10) + 1);
            System.out.println(computers[i]);
        }

        return computers;
    }
}

// It's better to use unmodifiable objects if you can
final class Computer {

    private final int id;
    private final int bet;

    public Computer(int id, int bet) {
        this.id = id;
        this.bet = bet;
    }

    public int getId() {
        return id;
    }

    public int getBet() {
        return bet;
    }

    @Override
    public String toString() {
        return "Computer " + id + " bets " + bet;
    }

}
import java.util.ArrayList at top of file

```
int maxBet = 0;
ArrayList<Integer> maxIds = new ArrayList<Integer>();
// This is a for each loop, it is saying, for each computer in the list of computers
for ( Computer computer : computers ){
    /* if that computer has a higher bet than what we previously thought 
     was the highest, empty our list and set maxBet to that, and add this 
     computer to the list of  computers that have that bet number */
    if (computer.getBet() > maxBet){
       maxIds.clear();
       maxBet = computer.getBet();
       maxIds.add(computer.getId());
    // another computer has the same max bet value
    } else if ( computer.getBet() == maxBet){
       maxIds.add(computer.getId());
    }
}
System.out.println("Max Bet: " + maxBet);
System.out.print("Computers with max bet: ");
// for each id in our list of computers that have the max bet 
for ( int id : maxIds ){
    System.out.print(id + " ");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM