251. Flatten 2D Vector

本文介绍了一种用于遍历二维向量的迭代器实现方法。通过使用Java语言,我们展示了如何创建一个能够平铺二维向量的迭代器,使得元素能够按照顺序逐一访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Implement an iterator to flatten a 2d vector.

For example,
Given 2d vector = 

[
  [1,2],
  [3],
  [4,5,6]
]

By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,2,3,4,5,6].

Follow up:
As an added challenge, try to code it using only iterators in C++ or iterators in Java.

首先的想法是保存peek的数,hasnext每次判断peek的数是不是为null,next返回peek的数。代码如下:

public class Vector2D implements Iterator<Integer> {
    Iterator<Integer> Rowiter;
    Iterator<List<Integer>> Coliter;
    Integer next;

    public Vector2D(List<List<Integer>> vec2d) {
        Coliter = vec2d.iterator();
        if (Coliter.hasNext()) {
            Rowiter = Coliter.next().iterator();
            while (!Rowiter.hasNext() && Coliter.hasNext()) {
                Rowiter = Coliter.next().iterator();
            }
            next = Rowiter.hasNext()? Rowiter.next(): null;
        }
    }

    @Override
    public Integer next() {
        Integer res = next;
        if (Rowiter.hasNext()) {
            next = Rowiter.next();
        } else { 
            while (!Rowiter.hasNext() && Coliter.hasNext()) {
                Rowiter = Coliter.next().iterator();
            }
            next = Rowiter.hasNext()? Rowiter.next(): null;
        }
        return res;
    }

    @Override
    public boolean hasNext() {
        return next != null;
    }
}

/**
 * Your Vector2D object will be instantiated and called as such:
 * Vector2D i = new Vector2D(vec2d);
 * while (i.hasNext()) v[f()] = i.next();
 */
但是可以简化代码,因为next和hasnext函数Iterator都有,可以直接用。代码如下:

 public class Vector2D implements Iterator<Integer> {
    private Iterator<List<Integer>> rec;
	private Iterator<Integer> n;
	
    public Vector2D(List<List<Integer>> vec2d) {
        rec = vec2d.iterator();
    }

    @Override
    public Integer next() {
        return n.next();
    }

    @Override
    public boolean hasNext() {
        while((n==null||!n.hasNext())&&rec.hasNext())
        	n = rec.next().iterator();
        return n!=null&&n.hasNext();
    }
}

/**
 * Your Vector2D object will be instantiated and called as such:
 * Vector2D i = new Vector2D(vec2d);
 * while (i.hasNext()) v[f()] = i.next();
 */

``` def get_obs(self, F_i): """Extracts the observations from a complete vector of model output, and returns them as a vector.""" temp_obs, pres_obs, enth_obs = self.get_obs_states(F_i) obs = np.concatenate((temp_obs.flatten(), pres_obs.flatten(), enth_obs.flatten())) return obs def split_obs(self, G_i): """Splits a set of observations into temperatures, pressures and enthalpies.""" temp_obs = self.reshape_to_wells(G_i[self.inds_obs_temp]) pres_obs = self.reshape_to_wells(G_i[self.inds_obs_pres]) enth_obs = self.reshape_to_wells(G_i[self.inds_obs_enth]) return temp_obs, pres_obs, enth_obs @abstractmethod def downhole_temps(self): raise NotImplementedError() class DataHandler2D(DataHandler): def get_full_temperatures(self, F_i): temp = F_i[self.inds_full_temp] temp = np.reshape(temp, (self.mesh.nz, self.mesh.nx)) return temp def get_obs_temperatures(self, temp_full): """Extracts the temperatures at each observation point from a full set of temperatures.""" temp_full = np.reshape(temp_full, (self.mesh.nz, self.mesh.nx)) mesh_coords = (self.mesh.xs, self.mesh.zs) interpolator = RegularGridInterpolator(mesh_coords, temp_full.T) temp_obs = interpolator(self.temp_obs_cs) return self.reshape_to_wells(temp_obs) def downhole_temps(self, temps, well_depth=-1300): """Generates the downhole temperatures for a given well.""" mesh_coords = (self.mesh.xs, self.mesh.zs) interpolator = RegularGridInterpolator(mesh_coords, temps.T) zs = self.mesh.zs[self.mesh.zs >= well_depth] if abs(zs[-1] - well_depth) > 1e-8: zs = np.append(zs, well_depth) downhole_coords = np.array([[w.x, z] for z in zs for w in self.wells]) temp_well = interpolator(downhole_coords) return zs, self.reshape_to_wells(temp_well) class DataHandler3D(DataHandler): def get_full_temperatures(self, F_i): temp = F_i[self.inds_full_temp] return temp def get_obs_temperatures(self, temp_full): """Extracts the temperatures at each observation point from a full set of temperatures.""" interp = LinearNDInterpolator(self.mesh.tri, temp_full) temp_obs = interp(self.temp_obs_cs) return self.reshape_to_wells(temp_obs) def downhole_temps(self, temp_full, well_num): """Returns interpolated temperatures down a single well.""" well = self.wells[well_num] elevs = [l.centre for l in self.mesh.m.layer if well.min_elev <= l.centre <= well.max_elev] if well.min_elev not in elevs: elevs.append(well.min_elev) coords = np.array([[well.x, well.y, e] for e in elevs]) interp = LinearNDInterpolator(self.mesh.tri, temp_full) downhole_temps = interp(coords) return elevs, downhole_temps```在代码中进行解释,也就是在每一行后面加一个#解释
最新发布
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值