[英]How to find position in two arrays in Java without java.util.Arrays
我有兩個 arrays:名稱[10] 和點數[10]
names 包含球員的名字,點他們的分數
我想用參數 String newName 和 int newPoints 編寫一個方法
根據點找到正確的 position(因此 newPoints=500 位於數組值 300 和 600 之間)
在索引中向后移動點和名稱 1 position 的所有值 - 為 newPoints 和 newName 創建空間
將 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.