【问题标题】:Is there a way to create/define a ArrayCopy with methods有没有办法用方法创建/定义 ArrayCopy
【发布时间】:2021-04-18 09:55:02
【问题描述】:

问题:据了解,我已经在方法中定义了原始数组,该数组在另一种方法和 main 中读取。当我尝试复制到新数组时,似乎会产生一个问题,无法将 +1 添加到 arraycopy。如果我跳过新数组,一切都会按预期工作。可以轻松创建打印arraycopy的方法。还是只在 main 中创建数组会更好?

错误: 我知道我的问题在这里:(大量图片)。 ArrayCopyError

  1. 如果 (names.length
  2. 我可能把 ArrayCopy 弄复杂了。 1.1 我在方法 readFile 中定义了第一个数组名称名称,其余的在 ma​​in Name[] names = readFile("names.txt") 中定义。是的,所有数组元素都在文件中,因此不会在 switch case 1 之外创建任何元素。

readFile:(没有 arrayCopy 它按预期工作)。 Array def 1

Main def 2.(没有 arrayCopy 它按预期工作)。 enter image description here

我应该做什么: // 创建一个大小为 n+1 的新数组,其中 n 是原始数组的大小。 我知道我必须测量 names.length 并创建相同大小的副本并加 1。 如图所示,我尝试添加 1,但它并不喜欢它。

//   Add the n elements of the original array in this array.
Some variant of:
copyArray = names[0];
copyArray = names[1]
continue....

可能不是我可以在文件中添加对象以进行复制的最佳方式,但它是一个循环,因此可能会添加新对象。

//   Add the new element in the n+1 position.
//   Print the new array.
Could be same as method: printNames

试过了: 我试过这个,它与我的关系最密切,但我 将其转换为 String,我不得不更改 copyArray[i] = intArray[i];复制数组[0]++;我认为这与 readFile 有关。还删除了数组的打印,因为我确实有 方法 printNames(Name[]names)。可能会创建相同的方法,但对于 arraycopy。 Try1

Try1 and Try2 is from this website

Try2

Potential candidate Stream API

String[] strArray = {"orange", "red", "green'"};

String[] copiedArray = Arrays.stream(strArray).toArray(String[]::new);

在文本文件中: 斯波克尼莫伊

西娜战士

简泰山

菲尔·柯林斯

尹基RM

王杰


    /**
 * 
 */
package fileObjectTutorial;
import java.io.*;
import java.util.*;


/**
 * @author 
 *
 */
public class FileObjectTutorial {
    
    /**
     * @param args
     */
    public static void main(String[] args)throws FileNotFoundException {
    
        //read file
        Name[] names = readFile("names.txt");
        //print names
        printNames(names);

           String fNamn;
           String eNamn;
           
           int fortsatta = 0;
           int counter = 0;
           int val;
           Scanner scanObj = new Scanner(System.in);

     while(fortsatta == 0){

           System.out.println("Fyll  i:\n1 Add name\n2 " + "closed\n3 " + "closed\n4 " + "closed");
           val = scanObj.nextInt();
           
        switch(val){
        
           case 1:
               System.out.println("1");
               for(int i =0; i<names.length; i++) {
                   if (names.length <= 24) {
                       String copyNames [] = new String[names.length];
                       System.out.println("Type in firstname and lastname: ");
                       Scanner copy = new Scanner(System.in);
                       fNamn = copy.next();
                       eNamn = copy.next();
                       Name k_obj = new Name(fNamn, eNamn);
                           names[counter] = k_obj;
                           counter++;
                           if(names != null || copyNames != null) {
                        //     System.out.print(names[i] + " ");
                        //     System.out.print(copyNames[i] + " ");
                           copy.close();
                           }
                   }
                   else
                   {
                       counter = names.length-1;
                       System.out.println("Array is full");
                       }
                   
               }
                 
                 break;
        case 2:
               System.out.println(".");
               
           case 3:
               System.out.println(".");
               break;
           case 4:
                   System.out.println(".");
                   break;
            default:
                   System.out.println(".");
                   } //slut switchsats
                   System.out.println("Go 0 Stop 1");
                   fortsatta = scanObj.nextInt();
                 }

                   scanObj.close();
                   System.out.println("end");
                   }    

               
public static void printNames(Name[]names){
    //iterate throught array
    for(Name n : names){
        //print each name
        if (n != null)
            System.out.println(n);
        }
    }   

public static Name[] readFile(String filename) throws FileNotFoundException{
    Name[] list = new Name[25];
    int count = 0;
    //open file
    File fileNames = new File(filename);
    if(fileNames.canRead()){
        //get scanner on file
        Scanner namedata = new Scanner(fileNames);

        //sentinel loop on hasNext
        while (namedata.hasNext()){
            //read firstname
            String namefirst = namedata.next();
            //read lastname
            String namelast = namedata.next();
            //build the name and put in array
            list[count] = new Name(namefirst, namelast);
            count++; 
            }
        namedata.close();
        }
    //return array
    return list;
    }

}


class Name {
        String firstName;
        String lastName;

        //constructor
        /**
        * null constructor - empty name
        */
        public Name(){
            this.setFirstName("");
            this.setLastName("");
            }
        /**
        * full constructor based on first and last name
        */
        public Name(String firstName, String lastName){
            this.setFirstName(firstName);
            this.setLastName(lastName);
            }
                
        
        //getters & setters
        /**
        * get the first name
        */
        public String getFirstName(){
            return this.firstName;
            }

        /**
        * get the last name
        */
        public String getLastName(){
            return this.lastName;
            }

        /**
        * set the first name
        *
        * @param firstName
        */
        public void setFirstName(String firstName){
            this.firstName = firstName;
            }
        /**
        * set the last name
        *
        * @param lastName
        */
        public void setLastName(String lastName){
            this.lastName = lastName;
            }


        //toString
        //toString
        public String toString(){
            return "Name [firstName = " + this.getFirstName() + ", lastname = " + 
        this.getLastName() + "]";
        }

    }   

【问题讨论】:

    标签: java arrays methods switch-statement copy


    【解决方案1】:

    问题是您的原始数组的长度始终为 25,如您的行所示: Name[] list = new Name[25];

    数组是否填充对象并不重要。没有Name 对象的索引将包含null。这意味着if (names.length &lt;= 24) { 将永远是false

    您可以将条件更改为if (names[i] == null) {。您可能也不需要counter 变量:names[counter] = k_obj;names[i] = k_obj; 的作用相同

    关于数组的复制:

    for loop 中的逻辑有缺陷。您正在每次迭代中创建一个新的副本数组。假设您有一个已填充的原始数组并且您想要复制它:

    Name[] original = readFile("someFile.txt");
    Name[] copy = Arrays.copyOf(names, names.length);
    

    【讨论】:

      猜你喜欢
      • 2019-08-22
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多