为什么此代码会产生“索引超出范围”的异常?

时间:2015-12-04 15:01:43

标签: c# .net arraylist

我知道这一定是一个重复的问题,但我不得不问,因为我无法理解为什么我的代码不起作用。我收到这个错误:

  

指数超出范围。必须是非负数且小于集合的大小

以下是我的代码中引发异常的部分:

import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.NotBlank;

public class RedirectModel {
    @Pattern(regexp="^/([^/].*)?$")
    @NotBlank
    private String continueUrl;

    public void setContinue(String continueUrl) {
        this.continueUrl = continueUrl;
    }

    public String getContinue() {
        return continueUrl;
    }
}

@Controller
public class LoginController {

    @RequestMapping("/login")
    public String login(Principal principal, @Valid @ModelAttribute RedirectModel model, BindingResult result) {
        if (!result.hasErrors() && principal != null) {
            // do not redirect for absolute URLs (i.e. https://evil.com)
            // do not redirect if we are not authenticated
            return "redirect:" + model.getContinue();
        }
        return "login";
    }
}

请给我一个答案。我不知道我应该做什么。它抛出了上面提到的异常。问题是它在private static void getPattern(ArrayList arrayList1) { ArrayList array_2008 = new ArrayList(); ArrayList array_2009 = new ArrayList(); ArrayList array_2010 = new ArrayList(); ArrayList array_2011 = new ArrayList(); ArrayList array_2012 = new ArrayList(); for (int i = 0; i < arrayList1.Count; i++) { if (arrayList1[i].ToString().Contains("2008")) { int a = getIndex(arrayList1[i].ToString()); array_2008[a] = arrayList1[i]; } if (arrayList1[i].ToString().Contains("2009")) { int a = getIndex(arrayList1[i].ToString()); array_2009[a] = arrayList1[i]; } else if (arrayList1[i].ToString().Contains("2010")) { int a = getIndex(arrayList1[i].ToString()); array_2010[a] = arrayList1[i]; } else if (arrayList1[i].ToString().Contains("2011")) { int a = getIndex(arrayList1[i].ToString()); array_2011[a] = arrayList1[i]; } else if (arrayList1[i].ToString().Contains("2012")) { int a = getIndex(arrayList1[i].ToString()); array_2012[a] = arrayList1[i]; } } 位置抛出。这是为什么?怎么解决?

这里的值:

“2008年4月28日”,“2008年4月29日”,5/10/2008同样33值

5 个答案:

答案 0 :(得分:1)

var array_2008 = new List<object>() {0, string.Empty};
var array_2009 = new List<object>() {0, string.Empty};
var array_2010 = new List<object>() {0, string.Empty};
var array_2011 = new List<object>() {0, string.Empty};
var array_2012 = new List<object>() {0, string.Empty};

for (int i = 0; i < arrayList1.Count; i++)
{
    var aIndex = getIndex(arrayList1[i].ToString());
    if (arrayList1[i].ToString().Contains("2008"))
    {
        //array_2008[0] = aIndex;
        //array_2008[1] = arrayList1[i]; uncomment this if you wanat to add List<T> other wise comment out bottom code 
        //and uncomment code above
        array_2008.Add( new List<object>()
        {
            aIndex, arrayList1[i].ToString() 
        });
    }
    if (arrayList1[i].ToString().Contains("2009"))
    {
        array_2009.Add( new List<object>()
        {
            aIndex, arrayList1[i].ToString() 
        });
    }
    else if (arrayList1[i].ToString().Contains("2010"))
    {
        array_2010.Add(new List<object>()
        {
            aIndex, arrayList1[i].ToString() 
        });
    }
    else if (arrayList1[i].ToString().Contains("2011"))
    {
        array_2011.Add(new List<object>()
        {
            aIndex, arrayList1[i].ToString() 
        });
    }
    else if (arrayList1[i].ToString().Contains("2012"))
    {
        array_2012.Add(new List<object>()
        {
            aIndex, arrayList1[i].ToString() 
        });
    }
}

答案 1 :(得分:0)

您可以依靠List<T>类并将FindAll()与谓词结合使用,从而进一步简化方法方法。

private static void getPattern(List<string> inputData)
    {
      List<string> array_2011 = inputData.FindAll(data => data.Contains("2011"));
      //...
    }

您可以将List<T>的通用参数更改为ArrayList内的任何内容,但在C#中使用Linq更容易,而不是{{1} (看起来你是从Java那里得到的吗?)。您甚至可以将其扩展为与任何ArrayList集合兼容。对于一般IEnumerable案例:

object

这将避免迭代大小为0的集合。

答案 2 :(得分:0)

你需要改变你接近这个的方式。您当前正在尝试获取参数数组中的值的索引,并在目标数组中使用它。当然,这不适用于空的ArrayList!

您需要做的是重新使用现代C#:

public static void GetPattern(List<string> values)
{
    var years = new Dictionary<string, List<string>>();

    foreach(var value in values)
    {
        if(value.Contains("2008")) 
        {
            if(!years.ContainsKey("2008")) years.Add("2008", new List<string>());
            years["2008"].Add(value);
        }

        if(value.Contains("2009")) 
        {
            if(!years.ContainsKey("2009")) years.Add("2009", new List<string>());
            years["2009"].Add(value);
        }

        // Add for each year you want to track.
    }

    // Do something with your pattern.
 }

答案 3 :(得分:0)

这是因为您尝试在位置a的数组列表(2008年至2012年)中添加值,但它们为空,因此a超出范围。 您需要使用数组列表的add函数或使用已设置为特定大小的数组(可能与arrayList1的大小相同)。希望这有帮助

答案 4 :(得分:-1)

由于ArrayLists为空,因此不存在索引。 frist添加一些虚拟数据来创建索引,然后添加实际值。 我希望这能解决你的问题,我已经测试过它正在运行

        private static void getPattern(ArrayList arrayList1)
    {
        ArrayList array_2008 = new ArrayList();
        ArrayList array_2009 = new ArrayList();
        ArrayList array_2010 = new ArrayList();
        ArrayList array_2011 = new ArrayList();
        ArrayList array_2012 = new ArrayList();

        for (int i = 0; i < arrayList1.Count; i++)
        {
            if (arrayList1[i].ToString().Contains("2008"))
            {
                int a = getIndex(arrayList1[i].ToString());
                for (int j = 0; j < a + 1; j++)
                {
                    array_2008.Add("empty");
                }
                array_2008[a] = arrayList1[i];
            }
            if (arrayList1[i].ToString().Contains("2009"))
            {
                int a = getIndex(arrayList1[i].ToString());
                for (int j = 0; j < a + 1; j++)
                {
                    array_2009.Add("empty");
                }
                array_2009[a] = arrayList1[i];
            }
            else if (arrayList1[i].ToString().Contains("2010"))
            {
                int a = getIndex(arrayList1[i].ToString());
                for (int j = 0; j < a + 1; j++)
                {
                    array_2010.Add("empty");
                }
                array_2010[a] = arrayList1[i];
            }
            else if (arrayList1[i].ToString().Contains("2011"))
            {
                int a = getIndex(arrayList1[i].ToString());
                for (int j = 0; j < a + 1; j++)
                {
                    array_2011.Add("empty");
                }
                array_2011[a] = arrayList1[i];
            }
            else if (arrayList1[i].ToString().Contains("2012"))
            {
                int a = getIndex(arrayList1[i].ToString());
                for (int j = 0; j < a + 1; j++)
                {
                    array_2012.Add("empty");
                }
                array_2012[a] = arrayList1[i];
            }
        }