【问题标题】:Beside contains method, what are other alternatives to compare an arraylist with string text file?除了包含方法之外,还有哪些其他方法可以将数组列表与字符串文本文件进行比较?
【发布时间】:2018-01-15 14:28:21
【问题描述】:

我对所有关键字/保留字都有一个ArrayList,但是当打印输出时,它会打印重复的关键字,我知道我可以使用HashSet 来消除重复项(我都试过了他们到目前为止工作)。但我认为contains 方法负责打印重复项。

contains 方法的替代方案有什么建议吗?

顺便说一句,我正在创建一个词法分析器,这是示例输入和输出

数组列表:

ArrayList<String> keywords = new ArrayList<>(Arrays.asList("auto","case","char","const","continue","default",
                            "do","double","else","break","enum","extern","float","for","goto",
                            "if","int","long","register","return","short","signed",
                            "sizeof","static","struct","switch","typedef","union",
                            "unsigned","void","volatile","while","then","int","endif"));

显示代码:

  System.out.print("Keywords:");
            for(int i =0; i<testarray.size(); i++){ 
            String gg = testarray.toString().replace(",","").replace("[","").replace("]","");

          String[] key = gg.trim().split(" ");
                 String gg1 = key[i];

                 if(keywords.contains(gg1)){

                     System.out.println(gg1+" ");
                 }
                 }

输入:

{

int a[3],t1,t2;

t1= 2 ; a[0]= 1; a[1]= 2; a[t1]= 3;

t2= - (a[2] + t1 * 6 ) / (a[2] - t1);

if t2 > 5 
then

print ( t2 );

else {

int t3 ; t3 = 99 ; t2 = -25 ;

print(- t1 +t2 * t3); 

} endif

}

输出: 关键词:int if then else int endif

读取文件:

while((line = bufferedReader.readLine()) != null) {

                test = line.split(" ");

                testarray.addAll(Arrays.asList(test));

            }

【问题讨论】:

  • 你能添加更多关于你想要做什么的细节吗?
  • 一些代码会有所帮助。因为contains 方法本身不会打印任何东西,因此几乎不能负责“打印重复项”。我怀疑你自己的代码是这里的罪魁祸首。
  • 您在每次迭代中使用完全相同的String gg 值。也许您的意思是testarray[i] 而不仅仅是testarray
  • @DodgyCodeException 他实际上是在“正确地”测试输入的不同单词,因为gg 被分割成空格,然后用i 进行索引。当然输入转换应该只做一次,当然不能使用.toString()...
  • 但是i 是基于testarray.size()(我猜是输入中的行数?)而不是gg 中的单词数,因此它可能无法正确处理每个word 并且当行数多于单词时会崩溃或崩溃

标签: java arraylist contains


【解决方案1】:

感觉你白白做复杂的事情:

数组列表:

ArrayList<String> keywords = Arrays.asList("auto","case","char","const","continue","default",
                            "do","double","else","break","enum","extern","float","for","goto",
                            "if","int","long","register","return","short","signed",
                            "sizeof","static","struct","switch","typedef","union",
                            "unsigned","void","volatile","while","then","int","endif");

显示代码:

Set<String> keys = new HashSet<>();
for (String key : testarray) { 
    if(keywords.contains(key)) {
        keys.add(key);
    }
}

System.out.print("Keywords:");
for (String key : keys) {
    System.out.println(key + " ");
}

【讨论】:

  • 这并不能解决唯一性问题,我怀疑testArray 是一个行数组,在这种情况下它不起作用
  • 是的,你做得很简单,但输出仍然是一样的。
  • @bryonkurtsegunto 我编辑了答案,告诉我现在是否可以
  • 当然我们可以用 lambda 做得更好,但我不知道 op 是否适用于 java 8。
  • 如果您希望关键字按字母顺序排列,您可以使用TreeSet 而不是HashSet
猜你喜欢
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2020-06-18
  • 2017-09-04
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多