我知道这一定是一个重复的问题,但我不得不问,因为我无法理解为什么我的代码不起作用。我收到这个错误:
指数超出范围。必须是非负数且小于集合的大小
以下是我的代码中引发异常的部分:
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值
答案 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];
}
}