簡體   English   中英

Java 判斷數組元素是否存在的方法

[英]Java method for checking whether an element of an array exists

我有兩個類,分別是 Ticket 和 Register。 Register 是一個 class,它接受一個 ticket 數組。 票證包含時間和帶有票證 ID 的字符串。 我的寄存器 Class 中的一種方法稱為 contains(),它返回一個 Boolean。它檢查寄存器是否包含具有該 ID 的票證。 我的問題是它只對第一個票證元素顯示 true 而對所有其他票證元素顯示 false 即使它包含票證,因此我相信問題出在我的 contains() function 上。我非常了解 Java 所以如果有人可以提供幫助我將不勝感激。 這是我的注冊代碼和我的驅動程序代碼。

/
// This is class called Register that has the methods:"add()","contains()","retrieve()" and the constructor "Register()"

public class Register{ 

public Ticket[] tickets; 
public int numTickets; 

public Register(){ 
tickets = new Ticket[100]; 
numTickets = 0; 

}

public void add(Ticket ticket){ //add ticket method. Takes a ticket as a parameter and adds it to the array

tickets[numTickets] = ticket;
numTickets = numTickets+1; // incramenting array

}


public boolean contains(String ticketID){ //contains method. Takes a string from the ticket using the ID() method and uses as a parameter.

boolean b = false; 

for (int i = 0;i<100;i++){ 

if (ticketID.equals(tickets[i].ID())){ // checks to see if ticket ID is in the array
b = true; // return value is true if found
break;
}
break; 
}
return b; // returns true of false
}

public Ticket retrieve(String ticketID){ // returns the ticket with the specified ID

int j = 0; // initializing return value
for (int i = 0;i<100;i++){ 

if (ticketID.equals(tickets[i].ID())){ 

j = i; 
break;     
}

}

return tickets[j]; // returns ticket
}


}

這是我的驅動程序代碼

public static void main(String[] args){


Register r = new Register();
Ticket t;
t = new Ticket(new Time("13:00"), "00001");
String ID_One = t.ID();
r.add(t);

t = new Ticket(new Time("13:18"), "00002");
String ID_Two = t.ID();
r.add(t);
System.out.println(r.contains(ID_One));
System.out.println(r.contains("00002"));
System.out.println(r.retrieve(ID_Two).toString());

Output 是:

true
false // this should be true
Ticket[id=00002, time=13:18:00] 

刪除第二個break ,它總是在第一次迭代時退出for循環,因此只會比較數組的第一個元素。

您可以將代碼簡化為 1 行:

public boolean contains(String ticketID) {
    return Arrays.stream(tickets).map(Ticket::ID).anyMatch(ticketID::equals);
}

您在if條件之外使用break語句,因此它只會檢查第一個元素然后中斷循環。 您可以通過更好的格式立即看到這一點。

for (int i = 0; i<100; i++){ 
  if (ticketID.equals(tickets[i].ID())){ // checks to see if ticket ID is in the array
    b = true; // return value is true if found
    break;
  }
  break; 
}

刪除第二個break以解決此問題,以便您僅在if條件為真時中斷。

對於個人建議,如果每張票都有唯一 ID,您可能需要考慮使用Map結構。 這可以大大減少您的搜索時間。

int numTickets = 0;
Map<String, Ticket> ticketMap = new HashMap<>();

public void add(Ticket ticket) {
  numTickets++;
  ticketMap.put(ticket.ID(), ticket);
}

public boolean contains(String ticketId) {
  return ticketMap.containsKey(ticketId);
}

public Ticket retrieve(String ticketId) {
  return ticketMap.get(ticketId);
}

暫無
暫無

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

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