2014-02-11 4 views
1

Хорошо, я все еще довольно новичок в этом. Поэтому идея состоит в том, что я хотел бы взять массив из одного класса, отправить его через некоторые уравнения и затем вывести обновленную версию. Мне также нужно, чтобы он повторялся несколько раз. Мое лучшее предположение: установить цикл while в моем основном классе с помощью метода класса внутри него, который соответствует обновлению массива. Его просто выплевывая те же ценности (не обновляясь), я бы очень признателен за любые предложения или советы о том, что я могу делать неправильно.Обновление массива из другого класса Java

** Если вы хотите сказать мне, чтобы я прочитал книгу или взял класс, пожалуйста, перейдите. Я изучаю сам, и этот сайт чрезвычайно полезен только тогда, когда он используется правильно. Спасибо

Код действительно длинный, поэтому я постараюсь опубликовать, какие фрагменты, которые я чувствую, будут наиболее полезными.

** Эта часть содержит исходные массивы (радиан [], т [] ...) Я хотел бы обновить

public class InitialGrids { 


PlanMat pm = new PlanMat(); 

int iic,ioc,iman ; 
int nic, noc; 
int iccomp, occomp, mcomp; 
double masIC, masOC, masMAN; 
double volp; 
double radIC, radOC, radp; 


public int iMat[ ]; 
public double rad[ ]; 
public double vol[ ]; 
public double rho0[ ]; 
public double mas[ ]; 
public double dmas[ ]; 

double pi = Math.PI; 

public InitialGrids(int icMat, int ocMat, int manMat, int shells, double massP, double ficore, double focore, double fman) 

{} 

** Этот класс должен обновить массив. жаль длины

public class Iterator 

    { 
final double G; 
final double PI; 
double Pave; 
double x, z, dy, dz, dydx; // this is for the iteration that will update the density 
double delta; 

public double grav[ ]; 
public double P[ ]; 
public double rho0n[ ]; 

int mix; 



public Iterator(int icMat, int ocMat, int manMat, int shells, double massP, double ficore, 

     double focore, double fman) 
{ 
    InitialGrids ig = new InitialGrids(icMat, ocMat, manMat, shells, massP, ficore, 
     focore, fman); 
    Constants c = new Constants(); 
    PlanMat pm = new PlanMat(); 

    G = c.GC; 
    PI = c.PI; 

    // calculation of gravity force at each shell 

    grav = new double [ shells + 1 ]; 

    for(int k = 0; k <= shells; k++) 
    { 
     grav[ k ] = ((G*ig.mas[k])/(Math.pow(ig.rad[k], 2))); 
    } 

    // calculation of pressure at zone boundaries 

    P = new double [ shells + 1 ]; 

    for(int k = shells - 1; k >= 0; k--) 
    { 
     P[shells] = 0; 

     P[ k ] = 0.5 * (grav[ k + 1 ] + grav[ k ]) * (ig.rad[ k + 1] - ig.rad[ k ]) * 
      ig.rho0[ k + 1 ]; 

    } 

    // this will calculate for the average pressure grid 

    rho0n = new double[ shells + 1 ]; 

    for(int k = 1; k <= shells; k++) 
    { 
     rho0n[ 0 ] = 0; 
     Pave = 0.5 * (P[ k ] + P[ k - 1 ]); 

     if(pm.eos[ ig.iMat[ k ] ] == 1) 
     { 
      z = 0.75*(pm.Ksp[ ig.iMat[ k ] ] - 4.0); 
      x = 1.0; 
      for(int j = 1; j <= 20; j++) 
      { 
       dy = 1.5 * (pm.Ks0[ ig.iMat[k] ]) * Math.pow(x, 5) * 
            (z * Math.pow(x,4) + (1.0 - 2.0 * z) * Math.pow(x, 2) + (z - 1.0)) - Pave ; 
       dydx = 1.5 * (pm.Ks0[ ig.iMat[ k ] ]) * Math.pow(x, 4) * 
            (9.0 * z * 

Math.pow (х, 4) + 7,0 * (1,0 - 2 * г) * Math.pow (х, 2) + 5 * (г - 1,8));
x = x - (dy/dydx); }

  rho0n[ k ] = ig.rho0[ k ] * Math.pow(x, 3);    
     } 

     else 
     { 
      rho0n[ k ] = pm.c[ ig.iMat[k] ] * Math.pow(Pave , pm.nn[ ig.iMat[k] ]); 
      rho0n[ k ] = rho0n[ k ] + pm.rho0[ ig.iMat[k] ] ; 
     } 

    } 

    // The following will: define the change in density after iterations, mix the old and new densities and then update the radial grids 

    delta = (Math.abs(rho0n[1]/ig.rho0[1]) - 1); 

    mix = 1; 

    for(int k = 0; k <= shells; k++) 
    { 
     rho0n[ k ] = rho0n[ k ] + ig.rho0[ k ] * (1 - mix);    //notice that rho0 = rho in desch's code. dont worry 
    } 

    // radius update using density dependent volume and then calculating radius from volume 

    for(int k = 1; k <= shells; k++) 
    { 
     ig.rad[ 0 ] = 0; 
     ig.vol[ 0 ] = 0; 

     ig.vol[ k ] = (ig.dmas[ k ]/ig.rho0[ k ]); 
     ig.rad[ k ] = Math.pow((0.75 * ig.dmas[ k ]/ig.rad[ k ]/PI + Math.pow(ig.rad[ k - 1 ], 3)) , 1.0/3); 
    } 
+1

Для начала, похоже, было бы очень полезно реорганизовать структуру данных. У вас есть то, что выглядит как * параллельные массивы *, где одно и то же место в каждом массиве соответствует одному составному элементу. Если это так, потяните поля в один класс (возможно, «InitialGrid») и вместо этого создайте массив «InitialGrid». Что касается вашей проблемы, вы не разместили ни один из кода, который действительно имеет дело с изменением чего-либо. – chrylis

+0

Как будут обновляться массивы? Будет ли какая-то математическая функция, через которую будут обрабатываться все значения, или будет затронут фактический размер массива? – NickJ

+0

Я только что опубликовал класс, который обновляет массивы. Это было не форматирование, так что это тоже я немного – handroski

ответ

2

Одна вещь, чтобы помнить, в Java является то, что примитивные типы передаются по значению, тогда как с объектами ссылка на объект передается по значению.

Если вы передадите примитив в метод и измените его внутри этого метода, когда вы вернетесь из этого метода, начальное значение не будет изменено, поскольку вы только изменили его копию внутри метода.

Чтобы получить новое значение из метода, вы должны вернуть значение из метода и установить старое значение в возвращаемый метод.

Если у вас есть несколько значений, которые необходимо вернуть, вы не можете сделать это в Java, так как метод может иметь только одно возвращаемое значение.

Одна вещь, которую вы могли бы сделать, а не использовать [] массивы, вы могли бы использовать объекты Array и передавать их в качестве аргументов. Все изменения, которые вы делаете внутри метода, будут отражаться при возврате из метода при редактировании одного и того же базового объекта данных. (Обратите внимание, что если вы переназначаете объекты массива, такие как inputArrayObject = new ArrayList(); внутри метода вы потеряете ссылку на внешний объект, и любые последующие изменения больше не будут отражаться при возврате из метода.

Редактировать: как сказал хрилис, похоже, что те массивы, которые вы, вероятно, тесно связаны и, возможно, должны быть втянуты в класс, который затем можно передать объекту этого класса в метод, который правильно изменит значения или вызовет метод класса на объекте, в зависимости от того, что именно нужно сделать.

Редактировать 2: Не достаточно, чтобы ответить на вопрос, поэтому я поставлю это здесь. Теперь, когда вы разместили код, я вижу первое, что вы делать со всеми аргументами, передавать их в InitialGrip co nstructor, почему бы не построить этот объект извне и передать его в конструктор Iterator, он будет более чистым. Также вы должны попытаться разбить некоторые из тех математических операций, которые вы делаете на методы. Таким образом, вместо того, чтобы иметь localVar = (тонна математики), localVar = calucalteDensity (аргументы).Это упростит чтение и отладку и позволит вам повторно использовать все, что вам нужно (я не попал прямо в код, чтобы точно знать, что он делает, может быть, ничего нельзя использовать повторно, все может быть другим)

+0

вы могли бы привести краткий пример этого? Похоже, хорошая идея, им просто не совсем понятно, правильно ли я это понимаю – handroski

+0

Пример того, что особенно важно? – HumanTarget

+0

, создавая объект извне и передавая его через метод. Вы имеете в виду, что означал этот ответ? – handroski

0

Я не знаю, есть ли у меня вопрос, но если вы хотите передать массив методу, вы можете просто передать его и установить массив того же типа, что и вывод вашего метода, например:

int[] methodNae(int iMat[ ]) { 
    int[] result;// you can even change the iMat and send it as the result 
    //Do whatever you want with iMat 
    return result; 
} 
Смежные вопросы