2016-11-19 62 views
0
package com.cp.javapractice; 

import java.util.ArrayList; 
import java.util.Scanner; 

public class Cp { 
public static void main(String args[]) { 
    ArrayList al = new ArrayList(); 
    Scanner s = new Scanner(System.in); 
    String str = null; 
    str = new String(); 
    System.out.println("Enter the string which you want to remove the  duplicates"); 
    str = s.nextLine(); 
    String arr[] = str.split(" "); 
    for (int k = 0; k < arr.length; k++) { 
     al.add(arr[k]); 
    } 
    try { 
     for (int i = 0; i < arr.length; i++) { 

      for (int j = i + 1; j < arr.length; j++) { 

       if (arr[i].equalsIgnoreCase(arr[j])) { 
        al.remove(j); 
       } 
      } 
     } 
     System.out.println(al); 
     } 
    catch (Exception e) { 
     System.out.println(e); 
    } 
} 
} 

我打算从用户中替换特定给定字符串中的重复单词。因此,我使用split方法将给定的字符串与空间分开,并将其放入数组以及arraylist中。循环执行时IndexOutOfBoundsException异常-java

遍历数组并检查条件后,它是相等的,然后我删除了ArrayList中的条件。但是,删除它显示索引超出限制例外。

此代码适用于小数组大小,但在给出大量数组大小时显示异常。 我有问题,而我给与13个字的数组大小的字符串。

这是我的完整代码。

+4

这是一个伟大的时间来学习如何使用调试器! – jdigital

+0

您省略了关键信息:异常堆栈跟踪(完整)以及代码中哪个语句引发异常的指示。请[编辑]您的问题,以包括缺少的信息 –

+0

[IndexOutOfBoundsException]可能的重复(http://stackoverflow.com/questions/4269153/indexoutofboundsexception) – mx0

回答

0
for (int i = 0; i < al.size(); i++) { 

    for (int j = i + 1; j < al.size(); j++) { 

     if (al.get(i).equals(al.get(j)) { 
      al.remove(j); 
     } 
    } 
} 
+0

为什么您将其删除到LowCase转换代码? @VojtechRuzicka – PassionInfinite

+0

对不起,我的坏,这是单位,只是想纠正缩进。 –

+0

我检查了我的编辑,它实际上只影响缩进。 –

0

例外是因为您使用的是arr.length而不是al.size()。对于每次移除,数组列表al的大小都会减小。所以,你必须考虑使用arraylist的大小而不是数组的大小。

for (int i = 0; i < al.size(); i++) { // change arr.length to al.size() 

      for (int j = i + 1; j < al.size(); j++) { // change arr.length to al.size() 

       if (arr[i].equalsIgnoreCase(arr[j])) { 
        al.remove(j); 

       } 
      } 
     } 

我建议你检查出HashSetTreeSet从而降低您删除重复的努力。


实现在HashSet

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Scanner; 
import java.util.Set; 


public class Cp { 
public static void main(String args[]) { 

    Scanner s = new Scanner(System.in); 
    String str = null; 
    str = new String(); 
    System.out.println("Enter the string which you want to remove the  duplicates"); 
    str = s.nextLine(); 
    String arr[] = str.split(" "); 

    Set<String> ts = new HashSet<String>(Arrays.asList(arr)); // -> added only this line 

     System.out.println(ts); 

} 
} 
+0

是的!集合将减少处理重复值的工作量。好的建议。 @SkrewEverything – PassionInfinite

+0

它正在工作。谢谢。 – Chitrapandi

+0

@Chitrapandi然后请将答案标记为已接受并结束问题。 – SkrewEverything

0

问题是你的第二环。开始于i + 1。但我从0到长度-1。所以最后的ein将是j = length-1 + 1,它超出了数组长度。

因此改变第一for循环:

for(int i=0;i < arr.length-2;i++)