从 ArrayList 方法类型返回 ArrayList

Posted

技术标签:

【中文标题】从 ArrayList 方法类型返回 ArrayList【英文标题】:Return ArrayList from ArrayList method type 【发布时间】:2014-04-23 12:49:29 【问题描述】:

我正在制作一个使用 ArrayList 作为卡片组的小卡片组程序。对我设置的限制之一是我“发”牌的方法必须是 Arraylist 类型。我遇到的问题是我不知道如何从 ArrayList 中只返回一个特定的索引值。见下文。

public ArrayList deal(int n, boolean up)
    Card card0 = new Card();
    boolean cardFace = card0.state(up);
    return al.get(0);  //<-- This doesn't work, Netbeans says that it is a string type
                            //not an ArrayList type.  The only thing it will actually
                            //allow me to return is:
    return.al;  // But this doesn't work, I don't need to return the whole list,
                // just the first element, but Netbeans calls that a String type, not
                // ArrayList

那么我怎样才能返回 List 的第一项并且仍然是正确的类型呢?其余代码无关紧要,只需要 Method 类型和 return 语句。

编辑:根据要求

package deckofcards;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Deck
    ArrayList<String> al = new ArrayList<>();
    public void shuffle()
        Collections.shuffle(al);
    
    public String displayDeck()
        String returnDeck = "";
        for(int i = 0; i < al.size(); i++)
            String printDeck = al.get(i);
            returnDeck += printDeck;
        
        return returnDeck;
    
    public ArrayList deal(int n, boolean up)
        Card card0 = new Card();
        boolean cardFace = card0.state(up);
        return al.get(0);
    
    public void populate()
        al.add(0, "Ace of Spades");
        al.add(1, "Two of Spades");
        al.add(2, "Three of Spades");
        //yadaa yadaa

【问题讨论】:

请向我们展示您的al 声明。这是什么? 我认为您误解了问题陈述或要求。如果您必须返回 ArrayList,那么您必须将结果 放入 ArrayList 并返回。此外,您不应该使用不合格的(即原始)泛型类型。这是一个ArrayList&lt;Someclass&gt;,它有助于了解Someclass 应该是什么。您确实没有提供足够的信息。 限制从何而来?如果您(在任何情况下)总是需要只返回一个元素,那么返回类型真的不应该是ArrayList。这种情况可能暗示你误解了你的任务(家庭作业?)。 deal(int n, boolean up) 这个方法签名看起来你应该返回一个 n 卡片的 ArrayList。我认为你需要重新阅读你的作业。 这个限制确实是导师规定的。这是我对问题的解释。本质上,我必须(在另一个类文件中)调用 deal 方法,该方法将显示列表中的 n 元素,然后删除它们。所以在测试类文件中,我执行deck0.deal(int n, boolean up),然后必须打印出n 卡片,声明它们是朝上还是朝下,然后从列表中删除这些元素。我不知道如何在测试类结束时做到这一点,所以我想我必须在方法本身中做到这一点,如上所述。 【参考方案1】:

//添加和删除员工 //显示员工列表

公共类 EployeeDB 静态 ArrayList e = new ArrayList();

public static boolean addEmployee(Employee e1) 

    e.add(e1);
    System.out.println("Employee added");
    return true;



public static boolean deleteEmployee(int ecode) 
    int temp = 0;
    for (int i = 0; i < e.size(); i++) 

        if (e.get(i).getID() == ecode) 
            temp = temp + 1;
            e.remove(i);
            break;
        
    
    if (temp == 1)
        System.out.println("Emp deleted");
    else
        System.out.println("Deletion unsuccessful, check ecode again");
    return true;



public static String showPaySlip(int ecode) 
    double salary = 0;
    int temp = 0;
    for (int i = 0; i < e.size(); i++) 
        if (e.get(i).getID() == ecode) 
            temp = temp + 1;
            salary = e.get(i).getSalary();
            break;
        
    
    if (temp == 1)
        return "Salary is" + salary;
    else
        return "No employye found with the specified ecode";



public static ArrayList<Employee> listAll() 

    return e;



public static void main(String[] args) 
    Employee e1 = new Employee();
    e1.setID(20);
    e1.setName("sai");
    e1.setSalary(150.00);
    addEmployee(e1);
    Employee e2 = new Employee();
    e2.setID(30);
    e2.setName("kumar");
    e2.setSalary(1500.00);
    addEmployee(e2);
    deleteEmployee(30);
    System.out.println(showPaySlip(30));

    for (int i = 0; i < e.size(); i++)
        System.out.println(
                listAll().get(i).getID() + " " + listAll().get(i).getName() + " " + listAll().get(i).getSalary());


【讨论】:

【参考方案2】:

如果您无法更改签名并且必须返回一个数组列表,那么您可以创建一个只有一个元素的数组列表并将其返回。像这样的:

ArrayList returnList = new ArrayList();
returnList.add(al.get(0));
return returnList;

我觉得不太好:-(

【讨论】:

@JasonC 是的,Jason 我在输入后才意识到...无论如何谢谢...已更正! 这可能是也可能不是 OP 需要的。由于问题非常不清楚,您应该发表评论要求澄清,或者等到问题有意义。【参考方案3】:

是否有理由必须返回 ArrayList?本质上,您正在尝试创建一个方法,该方法获取一副牌,挑选一张牌,然后返回一副牌。您可以尝试使用上面提到的 subList 方法。您可以创建一个只包含您想要的卡片的新 ArrayList,但这不是很有效。或者,如果您的目标是实际返回整个牌组,但在顶部有正确的卡片(也就是在 ArrayList 的第一个位置),那么网上有很多关于在 ArrayList 中重新排列值的信息。

编辑:根据您的完整代码,目标似乎是将第一张卡面朝上翻转。你应该这样做(不会为你做功课!)然后返回该方法接收的 ArrayList。IRL,想象给某人一副牌,他们将第一张牌翻面朝上,然后把牌还给你。

【讨论】:

【参考方案4】:

在您的具体情况下,alArrayList&lt;String&gt;。这意味着al.get(...) 返回一个String。但是,您的方法被声明为返回 ArrayList,而不是 String。您需要将您的方法返回类型更改为String,或者您需要构造一个新的ArrayList 并将您的单个字符串添加到其中并返回它。

您声明的返回类型需要与您要返回的对象相匹配。比如:

 ArrayList<String> al = ...;

 String getSingleItem (int index) 
     return al.get(index);
 

 ArrayList<String> getSingleItemAsArrayList (int index) 
     ArrayList<String> single = new ArrayList<String>();
     single.add(al.get(index));
     return single;
 

 ArrayList<String> getItems () 
     return al;
 

顺便说一句,通常最好将类型参数指定为ArrayList,例如ArrayList&lt;Whatever&gt;,因为这可以为您节省很多围绕/未经检查的转换的东西,并且可以在编译时检查类型。

【讨论】:

以上是关于从 ArrayList 方法类型返回 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

java---泛型总结

ArrayList详解

Array和ArrayList的异同点

用自定义 VBA 类包装 .Net ArrayList 获取迭代器

ListSetMap下各类型的对比

java用poi往excel里写数据遇到换行问题