为什么我不能减少 ArrayList/LinkedList 中的所有元素
Why can't I decrease for all elements in my ArrayList/LinkedList
原题:
最初,我想为 MyLinkedList 中的所有元素减少 (1)。但是,由于我不能在 MyLinkedList 中使用 foreach 循环,我首先将 MyLinkedList 中的所有元素转移到 ArrayList,然后对所有元素使用 foreach 循环减少 (1)。但问题是,我想每秒执行一次减少操作。
input : 5-6-7
output : 1 second : 4-5-6
2 second : 3-4-5 ...
我的问题:
我的代码的问题是:ArrayList 的第 i 个元素每秒减少 (1)。
input : 5-6-7
output : 1 second 4-6-7
2 second 4-5-6
...
到目前为止,这是我的代码。
public void decreaseTime(MyLinkedList l1,MyLinkedList l2) {
ArrayList<Integer> arr = new ArrayList<Integer>();
Node tmp = l1.first;
/*originally i want to decrease 1 for all elements of mylinkedlist.
since i cannot
use foreach in mylinkedlist i first transferred
elements of mylinkedlist to an Arraylist arr.
then decreased 1 for each element.*/
//lltoarr does copy all mylinkedlist elements to ArrayList arr.
lltoarr(l1, arr);
while (tmp != null) {
// simple sleep method which pauses the program for 1 second.
sleep();
int j = 0;
//decrease operation for each element of arr
for (int t : arr) {
//this is a trick for my program to work. you may ignore the next line.
int c = tmp.data.length() - 1;
t--;
arr.set(j, t);
// timeNew gets the new time which is the edited t element
int timeNew = arr.get(j);
if (somethin) {
//copy timeNew to String. i must store the time as string in mylinkedlist.
String newData = tmp.data.substring(0, c - 2) + timeNew
+ "h";
tmp.data = newData;
System.out.println(tmp.data);
sleep();
tmp = tmp.next;
}
else {
String newData = tmp.data.substring(0, c - 1) + timeNew
+ "h";
tmp.data = newData;
System.out.println(tmp.data);
sleep();
tmp = tmp.next;
}
j++;
}
System.out.println(arr);
}
}
MyLinkedList class :
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.LinkedList;
public class MyLinkedList {
Node first, last;
public void insertFirst(String s) {
Node n = new Node(s);
if (first == null) {
last = n;
}
n.next = first;
first = n;
}
public void insertLast(String s) {
Node n = new Node(s);
if (first == null) {
first = n;
} else {
last.next = n;
}
last = n;
}
public void deleteFirst() {
if (first.next == null) {
first = null;
last = null;
}
else if (first == null)
return;
else
first = first.next;
}
public void lltoarr(MyLinkedList ll, ArrayList<Integer> arr) {
Node tmp = ll.first;
while (tmp != null) {
String numberOnly = tmp.data.replaceAll("[^0-9]", "");
int time = Integer.parseInt(numberOnly);
arr.add(time);
tmp = tmp.next;
}
}
//decreaseTime method here
public void sleep() {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
public void print() {
Node tmp = first;
int i = 0;
while (tmp != null) {
System.out.print(tmp.data + " - ");
tmp = tmp.next;
}
}
public int nOfNodes() {
int n = 0;
Node tmp = first;
while (tmp != null) {
tmp = tmp.next;
n++;
}
return n;
}
public Node search(String s) {
Node tmp = first;
while (tmp != null) {
if (tmp.data == s) {
return tmp;
} else {
tmp = tmp.next;
}
}
return null;
}
public void llCopy(MyLinkedList ll, MyLinkedList llcopy,int i) {
llcopy.insertLast(ll.nthNode(i));
}
public void insertAfter(String s, Node n) {
Node nn = new Node(s);
nn.next = n.next;
n.next = nn;
}
}
您为列表编制索引的方式行不通。
如果您想遍历列表并调整每个值,我建议用具有递减函数的容器包装整数值
例如
public IntegerHolder {
private int value;
....
public void decrement(){
this.value--;
}
}
那你可以这样做
for(IntegerHolder value : list){
value.decrement();
}
否则,您可以使用 ListIterator 并删除旧值并插入递减后的值,
for(ListIterator<Integer> iter = list.listIterator();iter.hasNext();){
int value = iter.next(); // get current value
iter.remove(); // remove it from list
iter.add(value-1); // insert decremented value where old value was
}
我个人认为集合的 foreach 循环价值有限。通常我出于某种原因想访问迭代器,但它不会让我访问。
原题:
最初,我想为 MyLinkedList 中的所有元素减少 (1)。但是,由于我不能在 MyLinkedList 中使用 foreach 循环,我首先将 MyLinkedList 中的所有元素转移到 ArrayList,然后对所有元素使用 foreach 循环减少 (1)。但问题是,我想每秒执行一次减少操作。
input : 5-6-7
output : 1 second : 4-5-6
2 second : 3-4-5 ...
我的问题:
我的代码的问题是:ArrayList 的第 i 个元素每秒减少 (1)。
input : 5-6-7
output : 1 second 4-6-7
2 second 4-5-6
...
到目前为止,这是我的代码。
public void decreaseTime(MyLinkedList l1,MyLinkedList l2) {
ArrayList<Integer> arr = new ArrayList<Integer>();
Node tmp = l1.first;
/*originally i want to decrease 1 for all elements of mylinkedlist.
since i cannot
use foreach in mylinkedlist i first transferred
elements of mylinkedlist to an Arraylist arr.
then decreased 1 for each element.*/
//lltoarr does copy all mylinkedlist elements to ArrayList arr.
lltoarr(l1, arr);
while (tmp != null) {
// simple sleep method which pauses the program for 1 second.
sleep();
int j = 0;
//decrease operation for each element of arr
for (int t : arr) {
//this is a trick for my program to work. you may ignore the next line.
int c = tmp.data.length() - 1;
t--;
arr.set(j, t);
// timeNew gets the new time which is the edited t element
int timeNew = arr.get(j);
if (somethin) {
//copy timeNew to String. i must store the time as string in mylinkedlist.
String newData = tmp.data.substring(0, c - 2) + timeNew
+ "h";
tmp.data = newData;
System.out.println(tmp.data);
sleep();
tmp = tmp.next;
}
else {
String newData = tmp.data.substring(0, c - 1) + timeNew
+ "h";
tmp.data = newData;
System.out.println(tmp.data);
sleep();
tmp = tmp.next;
}
j++;
}
System.out.println(arr);
}
}
MyLinkedList class :
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.LinkedList;
public class MyLinkedList {
Node first, last;
public void insertFirst(String s) {
Node n = new Node(s);
if (first == null) {
last = n;
}
n.next = first;
first = n;
}
public void insertLast(String s) {
Node n = new Node(s);
if (first == null) {
first = n;
} else {
last.next = n;
}
last = n;
}
public void deleteFirst() {
if (first.next == null) {
first = null;
last = null;
}
else if (first == null)
return;
else
first = first.next;
}
public void lltoarr(MyLinkedList ll, ArrayList<Integer> arr) {
Node tmp = ll.first;
while (tmp != null) {
String numberOnly = tmp.data.replaceAll("[^0-9]", "");
int time = Integer.parseInt(numberOnly);
arr.add(time);
tmp = tmp.next;
}
}
//decreaseTime method here
public void sleep() {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
public void print() {
Node tmp = first;
int i = 0;
while (tmp != null) {
System.out.print(tmp.data + " - ");
tmp = tmp.next;
}
}
public int nOfNodes() {
int n = 0;
Node tmp = first;
while (tmp != null) {
tmp = tmp.next;
n++;
}
return n;
}
public Node search(String s) {
Node tmp = first;
while (tmp != null) {
if (tmp.data == s) {
return tmp;
} else {
tmp = tmp.next;
}
}
return null;
}
public void llCopy(MyLinkedList ll, MyLinkedList llcopy,int i) {
llcopy.insertLast(ll.nthNode(i));
}
public void insertAfter(String s, Node n) {
Node nn = new Node(s);
nn.next = n.next;
n.next = nn;
}
}
您为列表编制索引的方式行不通。
如果您想遍历列表并调整每个值,我建议用具有递减函数的容器包装整数值
例如
public IntegerHolder {
private int value;
....
public void decrement(){
this.value--;
}
}
那你可以这样做
for(IntegerHolder value : list){
value.decrement();
}
否则,您可以使用 ListIterator 并删除旧值并插入递减后的值,
for(ListIterator<Integer> iter = list.listIterator();iter.hasNext();){
int value = iter.next(); // get current value
iter.remove(); // remove it from list
iter.add(value-1); // insert decremented value where old value was
}
我个人认为集合的 foreach 循环价值有限。通常我出于某种原因想访问迭代器,但它不会让我访问。