gpt4 book ai didi

java - 按 LIFO 顺序从列表中获取对象? (后进先出)(初学者)

转载 作者:行者123 更新时间:2023-12-02 03:21:26 25 4
gpt4 key购买 nike

(请记住,这是一个初学者问题)

我有两个类; MailItemMailServer。我有一个测试类(class),我在其中制作邮件并将其发送到我的邮件服务器。我将 MailItems 发送给一个特定用户,并且我希望以 LIFO 顺序(后进先出)检索这些邮件,因此最后发送的必须是我收到的第一个。

这是我的类(class)。

MailItem 类:

public class MailItem
{
private String from;
private String to;
private String message;
private String subject;

public MailItem(String from, String to, String message, String subject)
{
this.from = from;
this.to = to;
this.message = message;
this.subject = subject;
}

public String getFrom()
{
return from;
}

public String getTo()
{
return to;
}

public String getSubject(){
return subject;
}

public String getMessage()
{
return message;
}

public void print()
{
System.out.println("From: " + from);
System.out.println("To: " + to);
System.out.println("Message: " + message);
System.out.println("Subject: " + subject);
}
}

邮件服务器类:

public class MailServer
{
private List<MailItem> items;
private HashMap<String, List<MailItem>> hashmap;

public int howManyMessages(){
return items.size();
}

public int howManyUsers(){
return hashmap.size();
}

public MailServer()
{
items = new LinkedList<MailItem>();
hashmap = new HashMap<String, List<MailItem>>();
}

public int howManyMailItems(String who)
{
int count = 0;
for(MailItem item : items) {
if(item.getTo().equals(who)) {
count++;
}
}
return count;
}

public MailItem getNextMailItem(String who)
{
Iterator<MailItem> it = items.iterator();
while(it.hasNext()) {
MailItem item = it.next();
if(item.getTo().equals(who)) {
it.remove();
return item;
}
}
return null;
}

public void post(MailItem item)
{
if(!isEmpty(item)){
items.add(item);
}
}

private boolean isEmpty(MailItem mail){
if(mail.getFrom() == "" || mail.getTo() == ""){
return true;
}
return false;
}

public int createMailbox(String user){
if(hashmap.containsKey(user)){
return 0;
}
List<MailItem> mil = new ArrayList<MailItem>();
hashmap.put(user, mil);
return 1;
}

public int createMailbox(String[] users){
int createdBoxes = 0;
for(String user: users){
int created = createMailbox(user);
if(created == 1){
createdBoxes++;
}
}
return createdBoxes;
}

private List<MailItem> getMailbox(String who){
if(hashmap.containsKey(who)){
List<MailItem> ls = hashmap.get(who);
return ls;
}else{
return null;
}
}
}

这是我的测试的样子:

@Test
public void testReceiveOrder(){
mailServer.post(mess1User1to2);
mailServer.post(mess2User1to2);
assertEquals(mess2User1to2,mailServer.getNextMailItem("user2"));
}

当我运行此测试时,我以 FIFO(先进先出)方式检索这些电子邮件。我没有检索名为 mess2User1to2 的邮件,而是得到 mess1User1to2。我尝试使用 LinkedList 在 LIFO 中检索它们,但它对我不起作用。我做错了什么?

最佳答案

您的 post 方法将该项目添加到列表末尾,并且您的 getNextMailItem 方法开始搜索列表前面的项目。因此,您将获得 FIFO(=队列)行为。

要更改此设置,请从列表末尾开始搜索:

public MailItem getNextMailItem(String who) {
ListIterator<MailItem> it = items.listIterator(items.size());
while(it.hasPrevious()) {
MailItem item = it.previous();
if(item.getTo().equals(who)) {
it.remove();
return item;
}
}
return null;
}

或者,您可以将项目添加到列表的前面,但我没有检查这是否会破坏任何其他方法:

private LinkedList<MailItem> items;

public void post(MailItem item) {
if(!isEmpty(item)){
items.addFirst(item);
}
}

关于java - 按 LIFO 顺序从列表中获取对象? (后进先出)(初学者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39559189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com