簡體   English   中英

How to find position in two arrays in Java without java.util.Arrays

[英]How to find position in two arrays in Java without java.util.Arrays

我有兩個 arrays:名稱[10] 和點數[10]

names 包含球員的名字,點他們的分數

我想用參數 String newName 和 int newPoints 編寫一個方法

  1. 根據點找到正確的 position(因此 newPoints=500 位於數組值 300 和 600 之間)

  2. 在索引中向后移動點和名稱 1 position 的所有值 - 為 newPoints 和 newName 創建空間

  3. 將 newPoints 和 newName 的值保存在空數組空間中

我不知道如何在數組 points[] 中找到正確的 position

到目前為止,這是我的方法:

public void enterSorted(String nameNew, int pointsNew) {
    int indexPlace;
    for(int i = points.length-1; i >= 0; i--) { //starts with i=10 (last array entry); stops when i is below 0 
        
      if(points[i] > pointsNew) {
        indexPlace = i+1;
        System.out.println("indexPlace "+indexPlace+" was saved. ");
        break;
      }
      System.out.println("points[" + i + "] ("+points[i]+ "is smaller than pointsNew - proceeding");
    }
  }

請刪除沒有人不能刪除它

發布答案后問題已更改 - ArrayIndexOutOfBoundsException應該是 SO 中的常見問題


對於未來,更多的 OO:而不是 arrays,使用List甚至SortedMap記錄如下:
public record Player(String name, int points) { }

首先,由於您總是在數組中尋找正確的 position,我們可以假設,我們的兩個數組是按遞增點排序的,所以我們不需要在我們這邊進行任何排序,只需要插入。 為此,我們搜索第一個 position 的點數高於我們所擁有的點數(我使用最大 int 進行了全部初始化,否則未使用的字段中有零)。 然后我們可以將那些從 position 向后移動到最后一個定義的(我決定為第一個未定義字段定義一個索引,但你只能檢查 maxInt,盡管使用這個變量我們可以檢查數組是否已滿)和最后寫我們的數據。 如果pos == firstUndef,我們后面都已經定義好了,不需要移動任何東西。

public class Tested {
    
    public String[] names = new String[10];
    public int[] points = new int[10];
    public int firstUndef = 0;

    public void initPoints() {
        for (int i = 0; i < points.length; i++) {
            points[i] = Integer.MAX_VALUE;
        }
    }
    
    public void addPlayer(String name, int point) {
        assert(firstUndef < points.length); // if false there is no room left in the arrays
        for (int i = 0; i <= firstUndef; i++) { // We only need to check for those defined and one more
            if (points[i] > point) {
                insertAt(name, point, i);
                break;
            }
        }
    }
    
    public void insertAt(String name, int point, int pos) {
        if (pos < firstUndef) {
            for (int i = (firstUndef - 1); i >= pos; i--) {
                points[i + 1] = points[i];
                names[i + 1] = names[i];
            }
        }
        points[pos] = point;
        names[pos] = name;
        firstUndef++;
    }

}

你可以像這樣使用和測試它:

Tested t = new Tested();
t.initPoints();

t.addPlayer("Peter", 300);
t.addPlayer("Frank", 600);
t.addPlayer("Avid", 500);

assert(t.names[0].equals("Peter"));
assert(t.names[1].equals("Avid"));
assert(t.names[2].equals("Frank"));

順便說一句:不要將變量設置為 public,我這樣做只是為了快速測試它。

暫無
暫無

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

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