【问题标题】:How to call list objects inside another class如何在另一个类中调用列表对象
【发布时间】:2015-05-01 15:01:57
【问题描述】:

我在名为Scorer.java 的类中有一个列表对象,我想在另一个名为MyParser.java 的类中导入aLinksbLinks 对象以打印aLinks.size()bLinks.size() 我试图导入类首先命名调用对象,但我不能这样做。你能告诉我如何将列表的对象从类导入到另一个类吗?以下是课程:

我的Scorer.java

 public class Scorer {
 public static List<LinkNode> score(LinkNode sourceLink, List<LinkNode> links){

 List<LinkNode> aLinks = new LinkedList<>();
 List<LinkNode> bLinks = new LinkedList<>();

    for (LinkNode link : links) {
        if(isbLink(sourceLink, link)) { 
            bLinks.add(link);
        } else {
            aLinks.add(link);
        }
    }

我的其他班级MyParser.java

public class MyParser {
private static final String[] PARSE_TAGS = new String[]{"a[href", "area[href"};


public static List<LinkNode> parse(LinkNode inputLink){
    Set<LinkNode> outputLinks = new LinkedHashSet<>();
    try {
         Document parsedResults = Jsoup
                .connect(inputLink.getUrl())
                .timeout(READ_TIMEOUT_IN_MILLISSECS)
                .get();

        String tag;
        Elements elements;
        List<LinkNode> result;

        //a[href
        tag = "a[href";
        elements = parsedResults.select(tag);
        result = toLinks(inputLink, elements, tag);
        outputLinks.addAll(result);

        // I want to print `aLinks.size()` and `bLinks.size()` here

    } 

    return new LinkedList<>(outputLinks);
}

【问题讨论】:

    标签: java object linked-list


    【解决方案1】:

    只要打电话

       MyParser myparser = new MyParser (); 
       myparser.parse(scorerInstance.getAlinks());
       myparser.parse(scorerInstance.getBlinks());
    

    scorerInstance 是 MyScorer 的一个实例。您应该在 MyScorer 类中为 aLinksbLinks 添加吸气剂,如下所示:

     public List<LinkNode> getALinks() {
          return  aLinks;
      }
    
     public List<LinkNode> getBLinks() {
          return  bLinks;
      }
    

    【讨论】:

    • aLinksbLinks 是(静态)方法score 中的实例变量。这是行不通的。
    • 对不起,但仍然出现错误:参数 aLinks 的修饰符非法;只允许 final 并且错误:参数 bLinks 的非法修饰符;只允许决赛@Master Mind
    • 谢谢@MasterMind 我解决了这个问题。感谢您的帮助。
    • 再次感谢。第一次我将它添加到Score 列表中的Scorer 类中并收到此错误。之后,我使用public static 方法将它添加到Score 列表之外,现在它工作正常。我只是想知道这会影响我的程序,因为我在score 列表之外带来了aLinksbLinks 行代码? @MasterMind
    • 如果它们属于 Score,最好将它们放入 Score 中。否则,不。
    【解决方案2】:

    您必须在Scorer 类中将所需的变量声明为全局变量和public 以及static

     public class Scorer {
    
     public static List<LinkNode> aLinks = new LinkedList<>();
     public static List<LinkNode> bLinks = new LinkedList<>();
     public static List<LinkNode> score(LinkNode sourceLink, List<LinkNode> links){
    
        for (LinkNode link : links) {
            if(isbLink(sourceLink, link)) { 
                bLinks.add(link);
            } else {
                aLinks.add(link);
            }
        }
       }
    }
    

    然后在MyParser类中,调用class_name .(dot) static_variable 。

    然后在MyParser 类中试试这个:

    System.out.println(Scorer.aLinks.size()+ " " + Scorer.bLinks.size());
    

    【讨论】:

    • score() 是一个静态方法。这是行不通的。
    • 我做不到。我有:允许参数的非法修饰符仅 final 。我 cpuld 没有在代码前面写 public @Md.NasirUddinBhuiyan
    • @medo0070 这是因为您没有将定义移出方法并将其转换为字段。你必须把它放在方法定义之外。
    【解决方案3】:

    如果类位于不同的包中,您需要将链接公开。但是您还需要将其设为静态并将其转换为类的字段

    public class Scorer {
        public static List<LinkNode> aLinks = new LinkedList<>();
    

    那你就可以Scorer.alinks访问了

    【讨论】:

    • 感谢您的帮助,但它不起作用。该程序不允许我在 List aLinks = new LinkedList(); 前面添加public static它说:illegal modifier for parameter only final is permitted@Evan Williams
    • @medo0070 将行移出方法并直接在public class Scorer { 下,就像我在回答中所做的那样。
    • 谢谢你现在的工作,但我想问这会影响我的程序吗?我的意思是在我的 lins 中 List&lt;LinkNode&gt; aLinks = new LinkedList&lt;&gt;(); List&lt;LinkNode&gt; bLinks = new LinkedList&lt;&gt;(); 在里面 List&lt;LinkNode&gt; score(LinkNode sourceLink, List&lt;LinkNode&gt; links) 因为 score 正在收集我的 aLinksbLinks ? @埃文威廉姆斯
    • @medo0070 这取决于你想要什么行为。如果您每次运行score 时都想要一个新的aLinks 和bLinks,您需要每次都初始化它们(不要再次声明它们!)。因此,您可以将aLinks = new LinkedList&lt;&gt;();bLinks = new LinkedList&lt;&gt;(); 添加到score 方法的顶部,并从声明变量的位置删除`= new LinkedList()`,因此声明看起来像public static List&lt;LinkNode&gt; aLinks; 和@987654337 @
    • 我按照你说的做了,但运行一段时间后出现错误。我想我会在删除 `= new LinkedList()` 之前保持原样。我在aLinksbLinks 顶部的score list 将从aLinksbLinks 收集信息并将它们添加到single list。因此,如果我在我写的问题中将它们排除在score 列表之外。这会让我得到不真实或不预期的结果吗?非常感谢@Evan Williamsas
    【解决方案4】:

    首先aLinksbLinks 应该是Scorer 类的成员,并且不应在该类的方法中声明。

    像这样:

    public class Scorer {
        public List<LinkNode> aLinks = new LinkedList<>();
        public List<LinkNode> bLinks = new LinkedList<>();
    }
    

    其次,您必须在 MyParser 类中获得一个 Scorer 对象。然后您可以访问aLinksBLinks。应该是这样的:

    Scorer myScorer = new Scorer();
    System.out.println(myScorer.aLinks().size());
    System.out.println(myScorer.bLinks().size());
    

    这应该添加到 MyParser 类中的注释部分的位置。

    第三,如果您的score 方法是静态的,那么您的score 方法中也应该有一个Score 类的实例。您可以将该实例传递给score 方法。像这样:

    public static List<LinkNode> score(LinkNode sourceLink, List<LinkNode> links, Score myScore){
        //myScore.aLinks or myScore.bLinks can be used here
    }
    

    【讨论】:

    • score() 是一个静态方法。这是行不通的。
    • 哦!我错过了。让我编辑代码。感谢您指出!
    • 我出错了,我无法在它所说的代码前添加“Public”:允许参数的非法修饰符仅 final @soham.m17
    • 因此 aLinks 和 bLinks 是静态的,因此您可以将 getter getBLinks() static
    • 好的。第一件事。 score 不是列表,而是方法。 Scorer 是一个类。当您在 score 函数中添加这两个声明语句时,您不能将这些变量设为公开。这就是为什么我告诉你在score 方法之外添加那些。现在我没有告诉你让他们static。当您将它们设为static 时,您为Scorer 类创建的所有对象的列表都是相同的。如果您有myScorerChemistrymyScorerPhysics,它们将具有相同的aLinksbLinks,并且没有区别。如果这就是你想要的,那就继续吧。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多