簡體   English   中英

為什么我不能減少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類:

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;

    }

} 

您如何為列表建立索引將無法正常工作。

如果要遍歷列表並調整每個值,我建議將Integer值包裝在具有減量功能的支架上

例如

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循環價值有限。 通常我出於某種原因要訪問迭代器,但它不會讓我使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM